日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

POJ3757 01分数规划

發布時間:2025/6/17 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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分数规划的全部內容,希望文章能夠幫你解決所遇到的問題。

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