Poj--2976(01分数规划)
2014-11-20 23:01:27
思路:01分数规划比较裸的一题,要个排序处理处出前n-k个点(贪心思想),然后再二分枚举。
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 8 const double eps = 1e-8; 9 10 int n,k; 11 double mid; 12 struct node{ 13 double a,b; 14 }t[1010]; 15 16 bool cmp(node a,node b){ 17 return a.a - mid * a.b > b.a - mid * b.b; 18 } 19 20 bool Check(){ 21 sort(t + 1,t + n + 1,cmp); 22 double res,up = 0.0,down = 0.0; 23 for(int i = n - k; i >= 1; --i){ 24 up += t[i].a; 25 down += t[i].b; 26 } 27 res = up - down * mid; 28 if(res > eps) return true; 29 return false; 30 } 31 32 int main(){ 33 while(scanf("%d%d",&n,&k) != EOF){ 34 if(n == 0 && k == 0) 35 break; 36 for(int i = 1; i <= n; ++i){ 37 scanf("%lf",&t[i].a); 38 t[i].a *= 100.0; 39 } 40 for(int i = 1; i <= n; ++i){ 41 scanf("%lf",&t[i].b); 42 } 43 double low = 0,high = 100; 44 while(fabs(high - low) > eps){ 45 mid = low + (high - low) / 2; 46 //printf("%.5f\n",mid); 47 if(Check()) 48 low = mid; 49 else 50 high = mid; 51 } 52 printf("%d\n",(int)(low + 0.5)); 53 } 54 return 0; 55 }

浙公网安备 33010602011771号