贪心
老鼠要获得最多的食品,就要用最少的猫食换取最多的猫食,这就要求j[i]/f[i]的比例要大。比例越大,证明在这个房间,小鼠付出最少得到的收获最大。
结构体排序
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n,m;
struct tr{
int j,f;
double t;
}mouse[3001];
bool cmp(tr a,tr b){
return a.t>b.t;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
while(cin>>n>>m&&(n!=-1||m!=-1)){
for(int i=1;i<=m;i++){
cin>>mouse[i].j>>mouse[i].f;
mouse[i].t=mouse[i].j*1.0/mouse[i].f;
}
sort(mouse+1,mouse+1+m,cmp);
double sum=0;
for(int i=1;i<=m;i++){
if(n>mouse[i].f){
sum+=mouse[i].j;
n-=mouse[i].f;
}
else{
sum+=mouse[i].t*n;//份额,剩余的钱能买几份
n=0;
break;
}
}
cout<<fixed<<setprecision(3)<<sum<<endl;
}
return 0;
}