日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ3757 01分数规划

發布時間:2025/6/17 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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])

這樣就滿足了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分数规划的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。