这个题描述的看起来复杂,其实思路很简单,就是个贪心算法,想要得到最多的javabean,怎么分配猫粮。
题中给出了得到J[i]所需的猫粮F[i],那么只需算出j[i]/F[i],然后进行排序,从最大的开始依次计算就可以了。
#include<iostream>
#include<iomanip>
#include<algorithm>
using namespace std;
#define MAX 1000
//构建一个结构体,方便接受数据和进行排序
struct node
{
double J;
double F;
double r;
}mouse[MAX];
bool cmp(node a,node b)
{
return a.r>b.r;
}
int main()
{
int M,N;
while(cin>>M>>N&&M!=-1&&N!=-1)
{
//输入J[i],F[i],并计算他们的比值
for(int i=0;i<N;i++)
{
cin>>mouse[i].J>>mouse[i].F;
mouse[i].r=mouse[i].J/mouse[i].F;
}
//排序
sort(mouse,mouse+N,cmp);
double sum=0;
//从最大的比值开始,计算能得到的最多javabean
for(int i=0;i<N;i++)
{
if(M==0) break;
if(M>=mouse[i].F)
{
sum=mouse[i].J+sum;
M-=mouse[i].F;
}
else if(M<mouse[i].F)
{
sum=M*mouse[i].r+sum;
break;
}
}
cout.setf(ios::fixed);
cout<<setprecision(3)<<sum<<endl;
}
}