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 }

 

posted @ 2014-11-20 23:03  Naturain  阅读(112)  评论(0)    收藏  举报