采用贪心的思考问题方法
即“做出的是在某种意义上的局部最优解”,对于本题来说,局部最优解就是整体最优解,因此采用贪心法。
解题结构
· 一个结构体来存储每个房间的状态以及性价比
· 调用C++的algorithm库的 sort( LengthFirstAddress , LengthFirstAddress+Length , Compare ) 函数来进行排序,如果没有Compare则默认从小到大排序
· Compare结构为bool Compare(Type a,Type b){ return a>b; }
(a > b为降序,a < b为升序,Type为a,b的数据类型)
解题核心
状态1:老鼠剩余的猫粮可以完全买下性价比最高的房子的豆子,那么买下,并更新自己持有的猫粮数,统计买到手的豆子
状态2:剩余的猫粮不足以买下性价比最高的房子的豆子,那么按百分比来买,并更新自己持有的猫粮数,统计买到手的豆子
,(此时已经没"钱"了,结束判断,输出结果)
Accept代码
/*
* Created by zsdostar in 2016/4/30
*/
#include <iostream>
#include<algorithm>
using namespace std;
struct greedheart
{
double value;
double JavaBean;
double CatFood;
};
bool compare(greedheart room1,greedheart room2)
{
return room1.value>room2.value;
}
int main()
{
int m,n;
struct greedheart room[10010];
while((cin>>m>>n)&&(m!=-1)&&(n!=-1))
{
double thentotal=m;
double sum=0;
for(int i=0;i<n;i++)
{
cin>> room[i].JavaBean >> room[i].CatFood;
room[i].value = room[i].JavaBean / room[i].CatFood;
}
sort(room,room+n,compare);
for(int i=0;i<n;i++)
{
if(thentotal < room[i].CatFood)
{
sum += (thentotal/room[i].CatFood)*room[i].JavaBean;
thentotal -= room[i].CatFood;
break;
}
else if(thentotal >= room[i].CatFood)
{
sum += room[i].JavaBean;
thentotal -= room[i].CatFood;
}
}
printf("%.3lf\n",sum);
}
}
(感觉英文才是ACM最大的难点。。看了TinyJian的翻译才看明白题意。。)
(TinyJian的博客:http://blog.csdn.net/TinyJian/article/details/48738693)