NYOJ 914 Yougth的最大化(二分搜索 + 贪心)
生活随笔
收集整理的這篇文章主要介紹了
NYOJ 914 Yougth的最大化(二分搜索 + 贪心)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Yougth的最大化
時(shí)間限制:1000?ms ?|? 內(nèi)存限制:65535?KB 難度:4 描述Yougth現(xiàn)在有n個(gè)物品的重量和價(jià)值分別是Wi和Vi,你能幫他從中選出k個(gè)物品使得單位重量的價(jià)值最大嗎?
輸入每組測試數(shù)據(jù)第一行有兩個(gè)數(shù)n和k,接下來一行有n個(gè)數(shù)Wi和Vi。
(1<=k=n<=10000) (1<=Wi,Vi<=1000000)
分析:k個(gè)物品單位重量的最大價(jià)值一定不會(huì)超過單個(gè)物品單位價(jià)值的最大值,且一定不小于0,這樣我們就求出了最終答案所在的區(qū)間。然后利用二分壓縮區(qū)間,直到求出最終結(jié)果。
#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; }
總結(jié)
以上是生活随笔為你收集整理的NYOJ 914 Yougth的最大化(二分搜索 + 贪心)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国内Java面试总是问StringBuf
- 下一篇: 分布式锁的几种实现方式~