题目链接:http://oj.luogu.org:8888/problemshow.php?pid=1570
分析:
1、裸搞。
按比值降序排列,然后去前m个
60分。
2、0 1 分数规划
关于 0 1 规划:http://blog.csdn.net/hhaile/article/details/8883652
设最终答案为R,x[i]为0或1,则 Σ(v[i]*x[i]) / Σ(c[i]*x[i]) = R
即 Σ(v[i]*x[i]) - Σ(c[i]*x[i]*R) =0
即 Σ[(v[i]*x[i]) - (c[i]*x[i]*R)] =0设 f(R)= Σ[(v[i]*x[i]) - (c[i]*x[i]*R)]
二分R,求f(R)=0
当f(R)<0时,R偏大
当f(R)>0时,R偏小
计算每一对 v[i] - (c[i]*R),排序求前m大的和即为f(R) 。
代码:
60:
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef struct
{
int a,b;
double c;
} nc;
nc t[201];
int n,m,i;
bool cmp(nc a1,nc a2)
{
if (fabs(a1.c-a2.c)<0.00000001) return a1.a<a2.a;
else return a1.c>a2.c;
}
int main()
{
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++) scanf("%d",&t[i].a);
for (i=1;i<=n;i++)
{
scanf("%d",&t[i].b);
t[i].c=t[i].a/(t[i].b*1.0);
}
sort(t+1,t+1+n,cmp);
int m1=0,m2=0;
for (i=1;i<=m;i++)
{
m1+=t[i].a;
m2+=t[i].b;
}
printf("%.3lf",m1/(m2*1.0));
return 0;
}
100:
#include<cstdio>
using namespace std;
int n,m,i,j,k;double ma,ans1,ans2;bool b[205];
struct jgtt
{
double c,v;
}a[205];
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%lf",&a[i].v);
for(i=1;i<=n;i++)
scanf("%lf",&a[i].c);
ans1=0;ans2=0;
for(i=1;i<=m;i++)
{
ma=0;int ji;
for(j=1;j<=n;j++)
if(!b[j]&&((a[j].v+ans1)/(a[j].c+ans2))>ma)
{
ma=(a[j].v+ans1)/(a[j].c+ans2);
ji=j;
}
b[ji]=1;
ans1+=a[ji].v;
ans2+=a[ji].c;
}
printf("%0.3f",ans1/ans2);
}