题目描述
解题思路
-
贪心思想,按性价比从大到小排序
-
排序后,如果猫粮剩余数量大于某个楼层最大交换量的猫粮,就全部拿走
否则就按照拿走剩余数量*性价比的量
代码
#include<iostream>
#include<algorithm>
using namespace std;
struct A{
double b,c,w; //b是豆子量,c是猫粮量,w是性价比
}num[1005];
bool cmp(A x,A y){ //自定义按性价比从大到小排序
return x.w>y.w;
}
int main()
{
int N,M;
while(cin>>M>>N&&M!=-1&&N!=-1){
double sum=0;
for(int i=1;i<=N;i++){
cin>>num[i].b>>num[i].c;
num[i].w=num[i].b/num[i].c; //一分豆子需要用多少猫粮换
}
sort(num+1,num+1+N,cmp);
for(int i=1;i<=N&&M;i++){
if(M>=num[i].c){
sum+=num[i].b;
M-=num[i].c;
}
else{
sum+=M*num[i].w;
M=0; //拿走了M的量,M就置0推出循环
}
}
printf("%.3lf\n",sum);
}
return 0;
}