POJ3757 01分数规划
生活随笔
收集整理的這篇文章主要介紹了
POJ3757 01分数规划
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ?有一個任務,給你提供n太服務器,讓你在這n太服務器中選出k臺完成這個任務,要求是每臺服務器的工作時間相同,總的花費最小。
思路:
? ? ?題目中給出對于每臺服務器有這個式子:
Total time = Processing time + Transmission time = fi / pi + fi / bi
轉化后是: time = fi * (pi + bi) / (pi * bi) 那么也就是說每臺服務器的工作速度是
v[i] = (pi * bi) / (pi + bi)
因為所有工作時間是一樣的,那么就會有 t = F / sigma(v[i]) ?(選出K個的)
則總的花費就是?
COST = sigma(fi * c[i])
? ? ?= sigma(v[i] * t * c[i])
? ? ?= t * sigma(v[i] * c[i]) ?
? ? ?= F / sigma(v[i]) * sigma(v[i] * c[i])
? ? ?= F * sigma(v[i] * c[i]) / sigma(v[i])
? ? ?= sigma(F * v[i] * c[i]) / sigma(v[i])
?
? ? ?有一個任務,給你提供n太服務器,讓你在這n太服務器中選出k臺完成這個任務,要求是每臺服務器的工作時間相同,總的花費最小。
思路:
? ? ?題目中給出對于每臺服務器有這個式子:
Total time = Processing time + Transmission time = fi / pi + fi / bi
轉化后是: time = fi * (pi + bi) / (pi * bi) 那么也就是說每臺服務器的工作速度是
v[i] = (pi * bi) / (pi + bi)
因為所有工作時間是一樣的,那么就會有 t = F / sigma(v[i]) ?(選出K個的)
則總的花費就是?
COST = sigma(fi * c[i])
? ? ?= sigma(v[i] * t * c[i])
? ? ?= t * sigma(v[i] * c[i]) ?
? ? ?= F / sigma(v[i]) * sigma(v[i] * c[i])
? ? ?= F * sigma(v[i] * c[i]) / sigma(v[i])
? ? ?= sigma(F * v[i] * c[i]) / sigma(v[i])
這樣就滿足了01分數規劃的要求模式了,直接二分就ok了,這個題目注意點精度問題,還有就是二分的上線開大點。
#include<stdio.h> #include<algorithm>#define eps 0.000001#define N 200000 + 100using namespace std;double X[N]; double V[N]; double D[N];bool OK(double L ,int n ,int k) {for(int i = 1 ;i <= n ;i ++)D[i] = X[i] - L * V[i];sort(D + 1 ,D + n + 1);double sum = 0;for(int i = 1 ;i <= k ;i ++)sum += D[i];return sum <= 0; }int main () {int n ,k;double f ,p ,b ,c;while(~scanf("%d %d %lf" ,&n ,&k ,&f)){for(int i = 1 ;i <= n ;i ++){scanf("%lf %lf %lf" ,&p ,&b ,&c);V[i] = p * b / (p + b);X[i] = V[i] * c * f;}double low = 0 ,up = 10000000000;double mid ,ans;while(up - low >= eps){mid = (low + up) / 2;if(OK(mid ,n ,k))ans = up = mid;else low = mid;}printf("%.4lf\n" ,ans);}return 0; }
?
總結
以上是生活随笔為你收集整理的POJ3757 01分数规划的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 3621 最优比率生成环
- 下一篇: POJ3692 最大点权独立集元素个数