您的位置:首页 > 其它

【贪心】【01规划】luogu 1570 KC喝咖啡

2013-10-13 11:10 169 查看
题目链接: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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oi 01分数规划