NYOJ 914 Yougth的最大化(二分搜索 + 贪心)
生活随笔
收集整理的這篇文章主要介紹了
NYOJ 914 Yougth的最大化(二分搜索 + 贪心)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Yougth的最大化
時間限制:1000?ms ?|? 內存限制:65535?KB 難度:4 描述Yougth現在有n個物品的重量和價值分別是Wi和Vi,你能幫他從中選出k個物品使得單位重量的價值最大嗎?
輸入每組測試數據第一行有兩個數n和k,接下來一行有n個數Wi和Vi。
(1<=k=n<=10000) (1<=Wi,Vi<=1000000)
分析:k個物品單位重量的最大價值一定不會超過單個物品單位價值的最大值,且一定不小于0,這樣我們就求出了最終答案所在的區間。然后利用二分壓縮區間,直到求出最終結果。
#include<stdio.h> #include<algorithm> using namespace std; #define eps 1e-4 const int N = 10005; double w[N], v[N], x[N], max_ave; int n, k;bool judge(double a) {for(int i = 0; i < n; i++)x[i] = v[i] - a * w[i]; sort(x, x+n);double sum = 0;for(int i = 0; i < k; i++)sum += x[n-1-i];return sum >= 0 ? true : false; }double get_ans() {double l = 0, r = max_ave;while(r - l > eps){double mid = (l + r) / 2;if(judge(mid))l = mid;elser = mid;}return l; }int main() {while(~scanf("%d%d",&n,&k)){max_ave = 0;for(int i = 0; i < n; i++){scanf("%lf%lf",&w[i],&v[i]);double tmp = v[i] / w[i];max_ave = max(max_ave, tmp);}printf("%.2lf\n",get_ans());}return 0; }
總結
以上是生活随笔為你收集整理的NYOJ 914 Yougth的最大化(二分搜索 + 贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国内Java面试总是问StringBuf
- 下一篇: 分布式锁的几种实现方式~