思路:将输入的J[i]和F[i]按照J/F的大小排序,从收获最大的开始,每次交易,总量加上J[i],M减去F[i],直到M不够支付一次完整的交易,最后一次按照M剩下的数量全部交易掉,得到结果。
结果:莫名其妙错了好几次,最后按照网上大神的代码重新改过就AC了。一个需要注意的问题,如果定义数组A存储J/F的值,则对A调用sort后,并不会改变J和F的排列,必须要定义结构体数组,并且自定义结构体比较函数作为谓词传给sort才能使整个数组(包含J,F)排序。(目前没发现更好的方法,如果之后看到了来补充。)
附代码:
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <cstdio>
using namespace std;
struct Node{
double J;
double F;
};
bool compare(struct Node a,struct Node b){
return a.J/a.F>b.J/b.F;
}
int main(){
int M,N;
while(cin>>M>>N&&(M!=-1||N!=-1)){
double sum = 0;
vector<Node> Mouse(N);
for(int i=0;M&&i<N;i++){
cin>>Mouse[i].J>>Mouse[i].F;
}
sort(Mouse.begin(),Mouse.end(),compare);
for(int i=0;M&&i<N;i++){
if(M>=Mouse[i].F){
M -= Mouse[i].F;
sum += Mouse[i].J;
}
else{
sum += Mouse[i].J*M/Mouse[i].F;M=0;
}
}
cout<<fixed<<setprecision(3)<<sum<<endl;
}
return 0;
}