FatMouse’Trade
杭电OJ——ACM 1009.FatMouse’ Trade链接入口
问题描述
肥老鼠换东西,m磅猫食,n间房子,每个房间有J[i]磅JavaBean,对应一个猫守卫需要F[i]磅猫食,可以按比率获取JavaBean,怎样才能获得最大数量的JavaBean。
算法思想:
贪心算法:贪心法一般指,在对问题求解时,总是做出在当前看来最好的选择。
特点:不从整体最优解出发来考虑,它所做出的仅是在某种意义上的局部最优解。
贪心法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题都能产生整体最优解或整体最优解的近似解,强调高效性。
解题思路:
计算各房间的利润然后排序,从利润最高的开始交换。
C++版AC代码
#include<iostream>
#include<stdio.h>
using namespace std;
//用于浮点数的换位
void swapDouble(double *a,double *b){
double temp;
temp=*a;
*a=*b;
*b=temp;
}
//用于整型数的换位
void swapInt(int *a,int *b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
int main(){
int M,N;
cin>>M>>N;
while(M!=-1&&N!=-1){
int F[1000],J[1000];
double a[1000];
//折算出猫粮换JavaBean的比率
for(int k=0;k<N;k++){
cin>>J[k]>>F[k];
a[k]=1.0*J[k]/F[k];
}
//将易物比率、猫粮、JavaBean按大小排序
for(int i=0;i<N-1;i++){
int flag=0;
for(int j=0;j<N-i-1;j++){
if(a[j]<a[j+1]){
swapDouble(&a[j],&a[j+1]);
swapInt(&J[j],&J[j+1]);
swapInt(&F[j],&F[j+1]);
flag=1;
}
}
if(flag==0)
break;
}
double sum=0;
//开始由大到小为优先顺序用猫粮换JavaBean
for(int t=0;t<N;t++){
if(M>=F[t]){
sum+=J[t];
M-=F[t];
}
else{
sum+=1.0*a[t]*M;
break;
}
}
printf("%.3lf\n",sum);
cin>>M>>N;
}
}
C++运行展示: