地址:http://acm.hdu.edu.cn/showproblem.php?pid=1009
这个题目好几年前就做过,一直莫名其妙的WA.
试了下,比例ratio用float 会WA, 用double OK (这都是int 与int 之间的比较,需要那么精确吗?)
思路:典型贪心,注意M,N是非负的,有可能为0,
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
int j, f;
double ratio;
}data[1001];
bool cmp(const node& lhs, const node& rhs)
{
return lhs.ratio >= rhs.ratio;
}
int main()
{
int M, N;
while(scanf("%d %d", &M, &N) && M>=0 && N>=0)
{
double sum = 0.0;
for(int i = 0; i < N; ++i)
{
scanf("%d %d", &data[i].j, &data[i].f);
if(data[i].f == 0)
{
data[i].ratio = 1000000000;
}
else
{
data[i].ratio = ((double)data[i].j)/data[i].f;
}
}
sort(data, data+N, cmp);
for(int i = 0; i < N && M>0; ++i)
{
if(M >= data[i].f)
{
sum += data[i].j;
M -= data[i].f;
}
else
{
sum += M * data[i].ratio;
M = 0;
}
}
printf("%.3f\n", sum);
}
return 0;
}