題意:
給出 n (1 ~ 1000),k (0 ~ 1000000000)代表有 n 個科目的成績,每個科目成績都有 a,b 兩種成績,後給出 n 個 a 和 n 個 b 的成績。現要使 y =
達到最大,當去除 k 個科目的成績之後,y 最大能取到多大。
思路:二分搜尋。y =
,所以100 * sigema(a) - y * sigema(b)
= 100 * (a1 + a2 + …… an) - y * (b1 + b2 + …… bn)
= (100 * a1 - y * b1)+ (100 * a2 - y * b2 ) + …… +(100 * an - y * bn)
= 0 ;
故列舉 y 後,先求出每個科目對應的 (100 * ai - y * bi) 值,後由大到小排序,取前面的 n - k 個。
若求和後的值 > 0,說明 y 小了,應該往右邊搜,l = mid;
若求和後的值 < 0,說明 y 大了,應該往左邊搜,r = mid;
若求和後的值 == 0,說明 y 的值剛剛好,但是可能還有更大的值出現,應該尋找最後乙個滿足條件的,所以應該往右邊搜,l = mid。所以區間應該為左閉右開。
為什麼要從大到小排序?
若從小到大排序的話,求和的結果 < 0 將會佔大多數,那麼二分搜尋就不會不斷往左邊搜,使這個平均值越來越小,而題目要求的是求最大值。那麼應該要讓求和結果 > 0 佔大多數,那麼應該由大到小排序才對。
#include#includeusing namespace std;//const int maxn=1010;
const double eps=1e-10;
int n,k;
double sum;
struct node
nodee[1100];
bool cmp(node a,node b)
printf("%.0f\n",ll);
}return 0;
}
poj 2976 基礎01分數規劃
這個題算是01分數規劃的最基本的應用了,01分數規劃是給你n對數 a1,b1 an,bn 然後讓你選擇一些數對,使得sigma ai sigma bi 最大。這裡附上講解乙份,如下 include include include include include using namespace std...
POJ 2976最簡單的 01分數規劃
題目 給出n個a和b,讓選出n k個使得 二分法 二分乙個mid看是否存在這樣的一組解,不斷縮小區間逼近最優值 include include include includeusing namespace std typedef long long ll define eps 1e 6 define...
0914 01分數規劃(基礎篇) POJ2976
傳送門 分析 這個就是典型的01分數規劃,最最普通的那種 題外話 poj真的有毒 不要用 lf 輸出 而且我也不知道怎麼講啊 直接上 吧 include include include include include define n 1009 define eps 1e 10 using name...