poj - 2976 题解

01分数规划

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 using namespace std;
 5 struct datatype
 6 {
 7     int a;
 8     int b;
 9     double c;
10 }data[10001];
11 int n,k;
12 bool com(const datatype& x,const datatype& y)
13 {
14     return x.c>y.c;
15 }
16 double cal(double x)
17 {
18     for(int i=1;i<=n;i++)
19     {
20         data[i].c=data[i].a-data[i].b*x;
21     }
22     sort(data+1,data+n+1,com);
23     double res=0;
24     for(int i=1;i<=n-k;i++)
25     {
26         res+=data[i].c;
27     }
28     return res;
29 }
30 int main()
31 {
32     while(true)
33     {
34         scanf("%d%d",&n,&k);
35         if(n==0&&k==0)
36         {
37             break;
38         }
39         for(int i=1;i<=n;i++)
40         {
41             scanf("%d",&data[i].a);
42         }
43         for(int i=1;i<=n;i++)
44         {
45             scanf("%d",&data[i].b);
46         }
47         double l=0.0,r=1.0;
48         double mid;
49         for(int i=1;i<=100;i++)
50         {
51             mid=(l+r)/2;
52             if(cal(mid)<0)
53             {
54                 r=mid;
55             }
56             else
57             {
58                 l=mid;
59             }
60         }
61         printf("%.0f\n",l*100);
62     }
63     return 0;
64 }
时间: 2024-10-14 06:53:31

poj - 2976 题解的相关文章

POJ 2976 3111(二分-最大化平均值)

POJ 2976 题意 给n组数据ai,bi,定义累计平均值为: 现给出一个整数k,要求从这n个数中去掉k个数后,最大累计平均值能有多大?(四舍五入到整数) 思路 取n?k个数,使得累计平均值最大. 定义C(x)表示能否取得n?k个数,使得累计平均值≥x.然后二分搜索最大的x. 可以这样判断可行性: 只需要从大到小选取n?k个(100?ai?x?bi)并求和sum,根据sum≥0来判断(上述的S表示n?k个元素下标的集合) #include <iostream> #include <al

POJ - 2976 Dropping tests &amp;&amp; 0/1 分数规划

POJ - 2976 Dropping tests 你有 \(n\) 次考试成绩, 定义考试平均成绩为 \[\frac{\sum_{i = 1}^{n} a_{i}}{\sum_{i = 1}^{n} b_{i}}\] 你可以考虑放弃 \(K\) 次成绩, 求最大平均成绩 * 100 小插曲: 被精度卡成喜羊羊 0/1分数规划\(from\)人生导师 Solution 01分数规划(不是很)裸题, 在每次 \(check\) 时, 选取较大的 \(num - K + 1\) 次即可 Code #

POJ 2976

http://poj.org/problem?id=2976 01分数规划问题,可以舍掉k组 01分数规划用于解决的经典问题是最优比率生成树 解法见http://www.cnblogs.com/lotus3x/archive/2009/03/21/1418480.html #include <iostream> #include <cstdio> #include <algorithm> using namespace std; double eps = 1e-8; d

poj - 3641 题解

题意:检验一个数是否是质数,且满足ap = a (mod p) 题解:快速幂,质数检验 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 using namespace std; 6 long long power(long long a,long long b,long long c) 7 { 8 long long res,t; 9 res=

poj - 3070 题解

题意:斐波那契数列的矩阵链乘求法. 题解:快速幂优化矩阵链乘解决. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 struct datatype 7 { 8 int a[2][2]; 9 }; 10 datatype multiple(datatype x,datatype y) 11 { 1

poj 1066 题解

题意:求从正方体外面到达这个黑点所需穿过的最少线段数(规定只能从线段中点穿过,包括最外层的墙),共有n面墙 0 <= n <= 30 题解:事实上枚举边界上的中点,判断它和黑点的线段与这些墙的交点数即可 解释:注意到,墙这一长线段相对于黑点连线,等价于直线--无论是在实现上还是题意上.连线若与墙相交,则黑点与枚举点必在墙两侧,无可避免地要穿过这面墙,至于从线段中点穿过在本题中是没有意义的.起始点选取本该在线段中点,但显然选取两个端点的最小值不会比它差,而一个端点的结果不会比相邻的两个中点结果好

poj 1556 题解

题意:如图,大概猜的到了?最多18面墙,每面墙上两个门,从(0,5)走到(10,5)的最短距离,保留两位小数 题解:这道题非常贴心地按序给出墙的坐标,把每个端点当做图里面的一个节点,用O(n3)时间判断每两点之间是否能连边,判断方法为判断直线与线段是否相交(事实上是两个线段,但在这道题里面用直线交线段即可),跑一个最短路即可(既然已经到了三次方级别,干脆写了最短的Floyd) #include<cmath> #include<cstdio> #include<cstring&

poj - 1002题解

题意:给定一个字符串,按一定格式处理后排序并输出 题解:转换成7位数字来处理即可,输出的时候注意格式. 1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 using namespace std; 5 long a[100001]; 6 bool com(const int &x,const int&y) 7 { 8 return x<y; 9 } 10 int main(

poj 2826 题解

题意:给出两条线段的位置(可相交),用它们来接落下来的雨水,问最终储水量是多少 题解:基本思路是求出两条线段交点,然后计算在交点上方部分三角形(短板效应,大小由较小的y确定)的面积即可. 注意点:事实上这个问题是判定+计算,要判定能不能接到水,再进行计算. 判定①:线段不相交或平行,则接不到水 判定②:以交点为起点的两条向上的两条线段中,一条线段完全挡住了另一条线段,则接不到水 由于存在判定,所以会出现精度问题,要注意eps的使用 实现: ①每条线段被交点分成两部分,用(1,0)×线段,选取结果