poj2976(01分数规划)

题目连接:http://poj.org/problem?id=2976

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn=1010;
 6 double a[maxn],b[maxn],d[maxn];
 7 int n,k;
 8 bool check(double x)
 9 {
10     double ans=0;
11     for(int i=0;i<n;i++)
12         d[i]=a[i]-x*b[i];
13     sort(d,d+n);
14     for(int i=k;i<n;i++)
15         ans+=d[i];
16     return ans>0;
17 }
18
19 int main()
20 {
21     while(scanf("%d%d",&n,&k)&&(n||k))
22     {
23         for(int i=0;i<n;i++)
24             scanf("%lf",&a[i]);
25         for(int i=0;i<n;i++)
26             scanf("%lf",&b[i]);
27         double l=0,r=1.0,mid;
28         while(r-l>1e-7)
29         {
30             mid=(l+r)*1.0/2;
31             if(check(mid)) l=mid;
32             else r=mid;
33         }
34         printf("%.0f\n",mid*100);
35     }
36 }
时间: 2024-12-28 16:42:02

poj2976(01分数规划)的相关文章

POJ2976 01分数规划 普通题

大意:给定A数组B数组,从中选择N-K个使得R最大,输出Round(100*R); 二分 l 当 F(l) >= 0 时,l = mid,否则,r = mid /**/ #include <cstdio> #include <cstring> #include <cmath> #include <cctype> #include <iostream> #include <algorithm> #include <map&g

[POJ2976][POJ2728]01分数规划问题的二分答案解法

这里就不放原题目了. POJ2976就是01分数规划的模板题,题目形式就是有n个物品,每个物品有对应的价值ai和代价bi,我们要取K个物品,使取的物品的  最小. 二分答案的解法特别妙,我们设 r= ,那么就有   由此不难发现,只要满足这条式子,我们能取的r越大越好. 不难发现此时已经满足二分答案的性质了. 二分r的大小,如果最后式子左边大于0,那么说明r取小了,如果左边小于0,说明r取大了. 那么我的代码如下: #include<iostream> #include<cstdio&g

[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

01分数规划入门

01分数规划是这样的一类问题,有一堆物品,每一个物品有一个收益ai,一个代价bi,我们要求一个方案使选择的最大. 首先我们来一道例题吧,01分数规划的大体方法都是一样的. 例1 Dropping Tests poj2976 给出n个物品,每个物品有两个属性a和b,选择n-k个元素,询问的最大值. 1<=n<=1000,0<=k<n,0<=ai<=bi<=1000000000. 首先这题显然是兹磁二分的,而就等价于. 所以我们发现二分完把ai-x*bi排序后把最大的

专题:01分数规划

poj2976 普通的01分数规划 大意:给定A数组B数组,从中选择N-K个使得R最大,输出Round(100*R); #include <iostream> #include <algorithm> #include <cmath> #include <cstdio> using namespace std; const int N = 1009; const double Eps = 1e-7; int n, k; double a[N], b[N];

01分数规划学习笔记

01分数规划学习笔记 http://www.cnblogs.com/perseawe/archive/2012/05/03/01fsgh.html [Poj2976 普通01分数规划] [Poj2728 最优比率生成树] TBD 原文地址:https://www.cnblogs.com/wuyuanyuan/p/8467899.html

[模板]01分数规划

01分数规划:有A[i]和B[i],求一个最优的选择,使$\frac{\sum{A[i]}}{\sum{B[i]}}$最大(最小同理). 设某一个可能的答案为r,那么经过变形,会有$\sum{A[i]-B[i]*r}$,当r是最优解时=0,r偏小时>0,r偏大时<0. 然后就可以二分这个r来做了. 板子题:poj2976(裸).poj2728(最优比例生成树).poj3621(最优比例生成环). 原文地址:https://www.cnblogs.com/Ressed/p/9581725.htm

[转]01分数规划算法 ACM 二分 Dinkelbach 最优比率生成树 最优比率环

01分数规划 前置技能 二分思想最短路算法一些数学脑细胞?问题模型1 基本01分数规划问题 给定nn个二元组(valuei,costi)(valuei,costi),valueivaluei是选择此二元组获得的价值(非负),costicosti是选择此二元组付出的代价(非负),设xi(xi∈{0,1})xi(xi∈{0,1})代表第ii个二元组的选与不选,最大(小)化下式 maximize(or minimize)   r=∑valuei?xi∑costi?ximaximize(or minim

01分数规划模板

/* 01分数规划模板(Dinkelbach) 01分数规划就是把 sum(a)/sum(b)转换成 f(x)=sum(a)-ans*sum(b); 当f(x)取到0时,ans取到了最大(小)值 poj 2976 两个长度为n的数组a,b 可以除去m个,怎样选择才能使剩下的 sum(a)/sum(b)的百分数最大 */ int n,m; struct Node{ int a,b; double v; ///用于排序筛选较大的值(题目要求极大值 bool operator<(const Node&am

poj3621 Sightseeing Cows --- 01分数规划

典型的求最优比例环问题 参考资料: http://blog.csdn.net/hhaile/article/details/8883652 此题中,给出每个点和每条边的权值,求一个环使 ans=∑点权/∑边权 最大. 因为题目要求一个环,而且必然是首尾相接的一个我们理解的纯粹的环,不可能是其他样子的环, 所以我们可以把一条边和指向的点看做整体处理. 上面方程可以化为:ans×e[i]-p[i]=0 以它为边权二分答案,spfa求负环,有负环则该ans可行,增大下界. 若一直不可行,则无解. #i