您的位置:首页 > 其它

HDU 1009 FatMouse' Trade 贪心水题

2016-08-12 23:20 513 查看
    又一道水题,贪心思想,就是一开始有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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: