无聊做题练练手
题目的大意:肥鼠使用猫粮和猫换粮食,猫把守着粮食仓库,仓库有不同的房间。不同房间的粮食需要使用不同量的猫粮换取。可以按比例换取一个房间的猫粮。求肥鼠最多可以换取多少粮食。此题毫无疑问使用贪心算法解决。解决此题代码如下:
#include <iostream>
#include <algorithm>
#define maxnum 1005
using namespace std;
struct room_type
{
int J;//有这么多食物
int F;
double J_F;
};
struct room_type room[maxnum];
bool cmpJ_F(room_type room1,room_type room2){
return room1.J_F<room2.J_F;
}
int main()
{
int M,N;
while(scanf("%d%d",&M,&N)&&M!=-1&&N!=-1)
{
for(int i=0;i<N;i++)
{
int j,f;
scanf("%d%d",&j,&f);
room[i].J = j;
room[i].J_F=f/(double)j;
room[i].F = f;
}
sort(room,room+N,cmpJ_F);//为什么会加到n
double max_get=0;
for(int i=0;i<N;i++)
{
if(M>room[i].F)
{
M-=room[i].F;
max_get+=room[i].J;
}else if(M>0)
{
max_get+=M/room[i].J_F;
M=0;
}else break;
}
printf("%.3lf\n",max_get);
}
return 0;
}
总结:c++中sort函数的使用可以很清晰的体会出函数传值的特点,同时此处也需要知道sort的回调函数的参数是以sort参数为地址的值。返回值为true时不用变换顺序,返回值为false是需要变换顺序。而排序的结果是将sort参数这一串地址中的值进行了排序。