FatMouse ' Trade
题目:
老鼠和猫交换事物的问题。老鼠有M磅的catfood,想要换取javabean;猫有N间仓库,第i间仓库里有J[I]的javabean,需要以F[i]的catfood换取(如果不能全部换取,那么可以按比例换取)。求Fatmouse可以最多换取多少的javabean。
分析:
贪心算法:以javabean/catfood的值做判断依据,比例越高,就优先换取。
1.定义结构体。cat的仓库,有javabean,需要catfood,以及pro(比值)。
2.需要按照比值进行排序。可以使用各种排序方法进行排序(快速排序,插入排序等等),也可以用自带的sort函数进行排序,但是需要注意的是sort(begin,end)是升序排列,题目所需是降序,所以可以用sort(begin,end,compare)进行降序排列,其中bool compare()中需要申明是以比例的降序(即 return r1.pro>r2.pro),然后把返回值作为sort的参数,当然也可以直接用sort(begin,end),然后在换取的时候从后面换取。
3.结果输出3位小数。c++中可以使用cout<<fixed<<setprecision(3)<<sum<<endl;c中可以用.3f。
4.sort ————#include<algorithm>
cout<<fixed<<setprecision(3)<<sum<<endl;————#include<iomanip>
printf("%.3f\n",sum); ————#include<stdio.h>
代码:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
using namespace std;
struct room{ //房间的结构体
int javabean;
int catfood;
double pro; //javabean与catfood的比值
};
bool compare(struct room r1,struct room r2){ //按照pro即比例的降序排列
return r1.pro>r2.pro;
}
int main(){
int m,n;
double sum;
struct room r[1001];
while(cin>>m>>n && m!=-1 && n!=-1){ //输入的m,n只要不是-1就继续执行
sum=0;
for(int i=0;i<n;i++){
cin>>r[i].javabean>>r[i].catfood;
if(r[i].catfood==0) r[i].pro=10000; //如果房间不需要catfood换取javabean,那么使其比例为10000.
else //否则比例是javabean/catfood
r[i].pro=1.0*r[i].javabean/r[i].catfood;
}
sort(r,r+n,compare); //把房间按照pro的大小排序
for(int j=0;j<n;j++){
if(m>r[j].catfood){ //如果fatmouse有的catfood大于所需要,那么就可以兑换
sum+=r[j].javabean;
m-=r[j].catfood;
}
else{ //否则,则按比例换取
sum+=m*(1.0*r[j].javabean/r[j].catfood);
break;
}
}
cout<<fixed<<setprecision(3)<<sum<<endl;
//printf("%.3f\n",sum); //保留三位小数
}
return 0;
}