题目来源:HDU 1009
简单题目分析:
小老鼠有M磅猫食,猫监管着若干存储javabean的仓库,小老鼠所要做的就是用猫食来和它们交易,每个仓库有J磅javabean,与此对应的是,小老鼠要用F磅猫食来交换这J磅javabean,值得一提的是,老鼠并不一定要兑换某个仓库内的全部javabean,而是可以兑换一部分(两者依旧成线性关系,J*a%磅javabean需要F*a%磅猫食来交换),问小老鼠最多能交换到多少磅javabean。
思路:
简单的贪心,每次先交换J/F比值最大(意味着单位磅猫食能换到最多javabean)的仓库即可,实现方法:sort结构体排序。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <string.h>
#include <stack>
using namespace std;
struct whouse
{
int J;
int F;
double rate;
};
bool cmp(whouse a,whouse b)
{
return a.rate>b.rate; //按比值排序
}
int main()
{
int M,N;
while( ~scanf("%d %d",&M,&N) && M!=-1 && N!=-1 )
{
double maxsum=0;
whouse temp[N];
int i;
for(i=0;i<N;++i)
{
scanf("%d %d",&temp[i].J,&temp[i].F);
temp[i].rate=(double)temp[i].J/temp[i].F;
}
sort(temp,temp+N,cmp);
for(i=0;i<N;++i)
{
if(M>=temp[i].F)
{
maxsum+=temp[i].J;
M-=temp[i].F;
}
else
{
maxsum+=M*temp[i].rate;
break;
}
}
printf("%.3lf\n",maxsum);
}
return 0;
}