题目链接:Click here
题意:FatMouse准备了m磅的食物,以便用来交换它喜欢的食物,JavaBean。
现在有N个房间,第i个房间有J[i]磅的JavaBean,其交换的筹码是F[i]磅的食物。
当然,FatMouse还是有很大的选择权的,对任意一个房间,它可以只交换一部分的食物。
现要求FatMouse以怎样的策略才能获得最多的JavaBean。
思路:将javaBean/catfood的比值从大到小排列,比值大的也就是性价比高, 换的食物多。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
double f, j, k;
}info[1005];
int cmp(node x, node y)
{
return x.k > y.k;
}//按照k的大小进行排序
int main()
{
//freopen("testin.txt", "r", stdin);
int m, n;
double ans;
while(scanf("%d%d", &m, &n) != EOF)
{
if(m == -1 && n == -1)break;
for(int i = 0; i < n; i++)
{
scanf("%lf%lf", &info[i].j, &info[i].f);
info[i].k = info[i].j / info[i].f;
}
sort(info, info+n, cmp);
ans = 0;
for(int i = 0; i < n; i++)
{
if(m > info[i].f)
{
ans += info[i].j;
m -= info[i].f;
}
else
{
ans += info[i].k * m;//如果m小于这个房间所需要的f值,那么就按照剩下的m换取所能得到的j
break;
}
}
printf("%.3lf\n", ans);
}
return 0;
}
本文介绍了一个算法问题,即如何通过最优策略使角色FatMouse用有限的食物交换到最多的JavaBean。解决方法是首先计算每个交换点的性价比(JavaBean与食物的比例),然后按性价比排序并依次进行交换,直到食物用尽。
1030

被折叠的 条评论
为什么被折叠?



