知识点:贪心算法
最简单的贪心:优先选择性价比高的。
#include <cstdio>
#include <cstdlib>
struct Cat
{
int J;
int F;
double per; //性价比
};
inline int cmp(const void *a,const void *b)
{
return ((Cat *)b)->per>((Cat *)a)->per ? 1 : -1;
}
bool scan_d(int &n) //整数输入外挂,减少时间
{
char i;
bool I=0;
i=getchar();
if(i==EOF) return 0;
while(i!='-'&&(i<'0'||i>'9'))
i=getchar();
if(i=='-') I=1,n=0;
else n=i-'0';
while(i=getchar(),i>='0'&&i<='9')
n=n*10+i-'0';
if(I) n=-n;
return 1;
}
int main()
{
int m,n;
while(scan_d(m),scan_d(n),m!=-1||n!=-1)
{
Cat cat[n];
for(int i=0;i<n;i++)
{
scan_d(cat[i].J);
scan_d(cat[i].F);
cat[i].per=1.0*cat[i].J/cat[i].F;
}
qsort(cat,n,sizeof(Cat),cmp);
double sum=0;
for(int i=0;i<n;i++)
{
if(m<cat[i].F)
{
sum+=m*cat[i].per;
break;
}
else
{
sum+=cat[i].J;
m-=cat[i].F;
}
}
printf("%.3lf\n",sum);
}
return 0;
}