又一道水题,贪心思想,就是一开始有M的钱,然后后面跟着N行,第一个数是能获得的数量,第二个数是获得这些数量所需要消费的钱,物体可以拆分开,问最多能获得多少东西,题目挺好理解,思路也很清晰,算出来这些东西的单价,然后排序从高的开始加,输出保留三位小数就能做出来了
因为帮同学改了这个程序,帮她改的时候发现了一些要注意的地方,顺便说下吧,一个是float型这道题的精度不够,所有数据都是不大于1000的,但是还要考虑小数点后面的,这样的话float的有效数字就不够了,所以要用double型。另外要注意1 0这组数据的结果是0.000,这组数据也过了的话应该就没什么问题了
下面AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int ob[1005],pay[1005];
double a[1005];
int main()
{
int m,n;
int t;
double sum,temp;
int i,j;
while(scanf("%d%d",&m,&n)!=EOF)
{
sum=0;
if(m==-1&&n==-1)
break;
for(i=0;i<n;i++)
{
scanf("%d%d",&ob[i],&pay[i]);
a[i]=(double)ob[i]/(double)pay[i];
}
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(a[j]>a[i])
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
t=pay[j];
pay[j]=pay[i];
pay[i]=t;
t=ob[j];
ob[j]=ob[i];
ob[i]=t;
}
}
}
for(i=0;i<n;i++)
{
if(m>pay[i])
{
m=m-pay[i];
sum=sum+(double)ob[i];
}
else
{
sum=sum+a[i]*(double)m;
break;
}
}
printf("%.3f\n",sum);
}
return 0;
}