原題:
//nyoj 914 二分+巧妙的貪心
//思路:因為題目限定選k個物品值是固定的,而結果rs的範圍我們也是可以知道的,即0mid * w <= v1+v2+...vk
// ----> mid *(w1 +w2+....+wk) <= v1+v2+...+vk
// ----> (v1+v2+...+vk) - (mid*w1 + mid *w2+...+mid*wk) >=0
// ----> (v1-mid*w1) + (v2-mid*w2) +... +(vk-mid*wk) >=0 最終式子①
// 所以說問題轉化為 對於給定的mid,如果能找到k個物品,如果他們滿足上面這個 式①這個mid就是合理的。
// 這時候就可以貪心了,用乙個陣列arr存放每個物品 mid*wi-vi的結果,然後從大到小排序,看前k個相加能否》=0能即為合理,返回1,否則則返回0
//小細節:這裡為了方便處理精度問題,我把結果進行了乘100處理,如果不理解可以忽略我處理精度的地方。
//這題之前做過,但是wa了很多次,沒有做出來。也是看了別人的思路才做出來的。現在自己做總結,希望加深印象,對二分和貪心有更深刻的認識。
#include#include#includeusing namespace std;
struct m
m[10001];
int n,k; // n個物品,選k個
double max(double a,double b)
int cmp(const void * a,const void * b) //快排,從大到小排序
int greed(double per) //檢測per的合法性
qsort(arr,n,sizeof(arr[0]),cmp);//對 vi-mid*wi 的結果排序
double sum=0;
for(int j=0;jif(sum<0)return 0;//小於0,不滿足式①,不合法,返回0
return 1;//大於等於,返回1
}int main()
double l=0; //區間左邊界
r=r*100; //精度處理
double rs=0; //存放結果
while(l<=r)
else
} printf("%.2lf\n",rs/100);
} return 0;
}
NYOJ 914 Yougth的最大化
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 yougth現在有n個物品的重量和價值分別是wi和vi,你能幫他從中選出k個物品使得單位重量的價值最大嗎?輸入 有多組測試資料 每組測試資料第一行有兩個數n和k,接下來一行有n個數wi和vi。1 k n 10000 1 wi,v...
NYOJ 914 Yougth的最大化
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 yougth現在有n個物品的重量和價值分別是wi和vi,你能幫他從中選出k個物品使得單位重量的價值最大嗎?輸入 有多組測試資料 每組測試資料第一行有兩個數n和k,接下來一行有n個數wi和vi。1 k n 10000 1 wi,v...
NYOJ 914 Yougth的最大化
題目資訊 時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 yougth現在有n個物品的重量和價值分別是wi和vi,你能幫他從中選出k個物品使得單位重量的價值最大嗎?輸入 有多組測試資料 每組測試資料第一行有兩個數n和k,接下來一行有n個數wi和vi。1 k n 10000 1...