POJ - 2976 Dropping tests (01分数规划)

终于把01分数规划这个坑填上了。

题意是有二维平面上的n个向量$(a_i,b_i)$,让你选择其中的m个,使得这些向量和的斜率,即$\frac{\sum a_i}{\sum b_i}$最小。

二分斜率,设$\frac{\sum a_i}{\sum b_i}\geqslant k$,即$\sum a_i\geqslant \sum kb_i$,即$\sum a_i-kb_i\geqslant 0$,选择$a_i-kb_i$前m大的向量判断是否大于0即可。

每次交POJ都得和CE刚上一番...

 1 #include<cstdio>
 2 #include<functional>
 3 #include<algorithm>
 4 using namespace std;
 5 typedef long long ll;
 6 typedef double db;
 7 const int N=1000+10,inf=0x3f3f3f3f;
 8 int n,k,a[N],b[N];
 9 db c[N];
10 bool ok(db x) {
11     db sum=0;
12     for(int i=0; i<n; ++i)c[i]=a[i]-x*b[i];
13     sort(c,c+n,greater<db>());
14     for(int i=0; i<k; ++i)sum+=c[i];
15     return sum>=0;
16 }
17 db bi(db l,db r) {
18     for(int i=0; i<100; ++i) {
19         db mid=(l+r)/2;
20         ok(mid)?l=mid:r=mid;
21     }
22     return l;
23 }
24 int main() {
25     while(scanf("%d%d",&n,&k),n) {
26         k=n-k;
27         for(int i=0; i<n; ++i)scanf("%d",&a[i]);
28         for(int i=0; i<n; ++i)scanf("%d",&b[i]);
29         printf("%.0f\n",bi(0,1)*100);
30     }
31     return 0;
32 }

原文地址:https://www.cnblogs.com/asdfsag/p/11826653.html

时间: 2024-10-02 22:09:07

POJ - 2976 Dropping tests (01分数规划)的相关文章

[poj2976]Dropping tests(01分数规划,转化为二分解决)

题意:有n场考试,给出每场答对的题数a和这场一共有几道题b,求去掉k场考试后,公式.的最大值 解题关键:01分数规划,double类型二分的写法(poj崩溃,未提交) 或者r-l<=1e-3(右边是精度) #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> #defi

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 2728 Desert King (01分数规划)

Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions:29775   Accepted: 8192 Description David the Great has just become the king of a desert country. To win the respect of his people, he decided to build channels all over his count

POJ 2728 Desert King 0-1分数规划

题意:链接 方法: 0-1分数规划 解析: 这是之前没填的坑,现在来填坑. 这道题题意就是n个三维坐标系的点,任意两点都可以连边,每条边的花费是两点在xOy坐标系下的欧几里得距离,每条边的收益是两点的z值差的绝对值. n个点连成一棵树 求最小的花费比收益. 即求最大的收益比花费. 一看求的东西就可以考虑0-1分数规划咯? 所以二分那个L,然后每条边的get-L*cost就是每条边新的权值,因为要拿最大的n-1条,所以上MST,但是这题是n^2的边,kruscal的话是n^2logn^2*log(

$POJ$2728 $Desert\ King$ 01分数规划

正解:01分数规划 解题报告: 传送门! 感觉挺板子的,,, 因为还没做,先瞎口胡一个做法$QAQ$ 如果翻车了请当做没看见我如果错了等$get$正确做法会重新编辑的$QAQ$ 就因为有$n\leq 100$,于是如果把它联成一个完全图边数连$1e4$都没有 所以考虑直接连成一个完全图,就成了之前寒假考试题二分专题那次的$T1$辽,就直接无脑01分数规划+最大生成树就欧克 $over$? 原文地址:https://www.cnblogs.com/lqsukida/p/10827485.html

POJ 3621 Sightseeing Cows 01分数规划,最优比例环的问题

http://www.cnblogs.com/wally/p/3228171.html 题解请戳上面 然后对于01规划的总结 1:对于一个表,求最优比例 这种就是每个点位有benefit和cost,这样就是裸的01规划 2:对于一个树,求最优比例 这种就是每条边有benefit和cost,然后通过最小生成树来判断 3:对于一个环求最优比例 这种也是每条边有benefit和cost,然后通过spfa来判断 其实01规划最核心的地方,在于构建01规划函数,构建好函数,然后根据单调性,判断大于0或者小

POJ 3621 Sightseeing Cows | 01分数规划

题目: http://poj.org/problem?id=3621 题解: 二分答案,检查有没有负环 #include<cstdio> #include<algorithm> #include<cstring> #define N 1005 using namespace std; struct node { int nxt,v; double w; }e[N*5]; int head[N],ecnt,L,P; double dis[N],fun[N],l,r,mid

『POJ 2976』Dropping tests (01分数规划)

题目链接 Descrip In a certain course, you take n tests. If you get ai out of bi questions correct on test i, your cumulative average is defined to be . Given your test scores and a positive integer k, determine how high you can make your cumulative avera

poj 2976 基础01分数规划

这个题算是01分数规划的最基本的应用了, 01分数规划是给你n对数(a1, b1)....(an, bn), 然后让你选择一些数对, 使得sigma(ai)/sigma(bi)最大.这里附上讲解一份, http://blog.csdn.net/hhaile/article/details/8883652, 代码如下: #include <cstdio> #include <cstring> #include <algorithm> #include <iostre