FatMouse' TradeTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 104866 Accepted Submission(s): 36611 Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean.
Input The input consists of multiple test cases. Each test case begins with a line containing two non-negative integers M and N. Then N lines follow, each contains two non-negative integers J[i] and F[i] respectively. The last test case is followed by two -1's. All integers are not greater than 1000.
Output For each test case, print in a single line a real number accurate up to 3 decimal places, which is the maximum amount of JavaBeans that FatMouse can obtain.
Sample Input 5 3 7 2 4 3 5 2 20 3 25 18 24 15 15 10 -1 -1 Sample Output 13.333 31.500 |
本题使用贪心算法
我的思路是设计一个room结构体,里面有两个整型变量j和f分别储存房间里J[i] pound 的JavaBeans 和与之对等的需要的cat food F[i],还有一个double类型的变量rate存放 每磅 cat foot可以兑换的 javabean的磅数(表现形式为比值)
然后对存储房间信息的rooms结构体数组进行降序排序,每次先去兑换率最高的房间去兑换javabean,这样得出的结果就是本题的最优解
ac代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int M,N;
struct room{
int j;
int f;
double rate;
}rooms[1001];
bool cmp(room r1, room r2){ //降序排序room结构体的比较函数,与下面C++的sort函数搭配使用,注意变量类型需要与要排序的结构体类型一致
return r1.rate>r2.rate;
}
int main()
{
while(scanf("%d%d",&M,&N)&&M!=-1&&N!=-1){
for(int i=0;i<N;i++){
scanf("%d%d",&rooms[i].j,&rooms[i].f);
double r = rooms[i].j*1.0/rooms[i].f;
rooms[i].rate = r;
}
sort(rooms,rooms+N,cmp);
double sum = 0;
for(int i=0;i<N;i++){
if(M>=rooms[i].f){
sum+=rooms[i].j;
M-=rooms[i].f;
}else{
sum+=M*rooms[i].rate;
break; //这里没有判断M 因为当M小于rooms.f[i]时M将全部被兑换完,此时就可以退出循环了,所以有一句break的代码
}
}
printf("%0.3f\n",sum);
}
return 0;
}