题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1009
题意:老鼠有M磅猫粮,它要去跟猫做交易,拿它的猫粮换鼠粮,现有n个房间,第i个房间都有J[i]磅的鼠粮,同时需要支付F[i]磅猫粮,但是老鼠可以不用把鼠粮全部换走,即它可以用x磅的猫粮换取x*(J[i] / F[i])的鼠粮,问M磅猫粮最多可以获取鼠粮的重量。
思路:贪心算法,求最优解。将J[i]/F[i]的值从大到小排列,总是先取最大的,就能保证能够得出的是最大值
My DaiMa:
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
struct person
{
double a,b,pi;
}s[1003];
bool cmp1(person p1, person p2)
{
return p1.pi > p2.pi;
}
int main()
{
int n, m;
while (cin >> m >> n)
{
if (m == -1 || n == -1)
break;
else
{
for (int i = 0; i < n; i++)
{
cin >> s[i].a >> s[i].b;
s[i].pi = s[i].a / s[i].b;
}
sort(s, s + n, cmp1);//根据兑换率对结构体进行排序
double ans = 0;
for (int i = 0; i < n; i++)
{
if (m >= s[i].b)
{
m -= s[i].b;
ans += s[i].a;//表示它的猫粮够换取这个房间里的所有鼠粮
}
else
{
ans += s[i].pi*m;//用它剩下的猫粮乘以兑换率
break;
}
}
printf("%.3lf\n", ans);
}
}
}