这个题的大意是:它有M猫食,N个房间,每个房间有f[i]猫食,j[i]量的 javabean,按一定的比例拿猫食来保护javabean。问一共有M猫食最多能保护多少javabean。
简单的贪心,只需按每个房间的javabean和猫食的比例从高到底排序,然后贪心即可。
代码中我处理了输入时f[i]等于0的情况,但交上去WA,我删去之后就AC了,看来没必要处理啊,,
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
struct food
{
int f,j;
double ave;
}s[1010];
int cmp(const food &a,const food &b)
{
return a.ave>b.ave;
}
int main()
{
int i,k,n,m;
double ans;
while(scanf("%d%d",&m,&n))
{
if(m==-1 && n==-1)
break;
for(i=0;i<n;i++)
{
scanf("%d%d",&s[i].j,&s[i].f);
s[i].ave=(double)s[i].j/s[i].f;
}
sort(s,s+n,cmp);
ans=0;
for(i=0;i<n;i++)
{
if(s[i].f<=m)
{
ans+=(double)s[i].j;
m-=s[i].f;
}
else
{
ans+=s[i].ave*m;
break;
}
}
printf("%.3f\n",ans);
}
return 0;
}