nyoj 914 Yougth的最大化

2021-08-04 15:44:44 字數 1269 閱讀 3955

原題: 

//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...