题意:给出两个数以及两个序列,第一个序列是能获得的最大价值,第二个序列是获得这个价值需要的付出,求最大价值。
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1009
思路:求每个的“性价比”,每次取性价比最高的那个,取完就置为0。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
double javabean[1100];
double pays[1100];
double deserve[1100];
int main()
{
double n,m;
while(cin >> m >> n)
{
if(n == -1 && m == -1)
break;
for(int i=0; i<n; i++)
{
scanf("%lf%lf",&javabean[i], &pays[i]);
deserve[i] = javabean[i]/pays[i];
}
double sum=0;
while(m)
{
double maxn = 0;
int k;
for(int i=0; i<n; i++)
{
if(maxn <= deserve[i])
{
k = i;
maxn = deserve[i];
}
}
if(maxn)
{
if(m >= pays[k])
{
sum += javabean[k];
m -= pays[k];
deserve[k] = 0;
}
else
{
sum += deserve[k]*m;
m = 0; //全部用来取这个了
}
}
else
break;
}
printf("%.3f\n",sum); //此处在codeblocks上不能用%lf,答案会全部是0.000
}
return 0;
}