ummmmmm,这题思路也很清晰,肥老鼠要换,把比率计算保存下来,并且猫的仓库index也要保存,用一次排序,从高到底,一路换就好了,贪心的思路就好,但是......WA,依旧没有AC......很难受
# include<iostream>
# include<algorithm>
#include <iomanip>
using namespace std;
struct BILV {
double BL;
int index;
};
bool cmd(BILV x, BILV y) {//大的为true
return x.BL > y.BL;
}
int main(void) {
int N,M;//肥老鼠的手里有M, 先 M 后 N
double F[1000], J[1000];//J[i]老鼠要,F[i]老鼠有的,后面的 N行 接 先 J[i] and F[i] 所有数据皆为非负数
BILV BiLv[1000];
double sum = 0;
int i;
cin >> M >> N;
while (N != -1 && M != -1) {//非双负1
if (N <= 0 || M <= 0) {
return 0;//出现负数结束
}
else {
sum = 0;
for (i = 0; i < N; ++i) {
cin >> J[i] >> F[i];
BiLv[i].BL = (double)(J[i] / F[i]);
BiLv[i].index = i;
}//录入数据
sort(BiLv, BiLv+N, cmd);
//sort大于排序
for (i = 0; i < N; ++i) {
if (M) {//手里有M就继续
if (M >= F[BiLv[i].index]) {//可以换这个房间的所有
sum = sum + J[BiLv[i].index];
M = M - F[BiLv[i].index];
}
else {//说明不够
sum = sum + BiLv[i].BL* M;//剩余的全兑换比率
M = 0;
}
}
else
break;
}
cout.setf(ios::fixed);
cout <<setprecision(3)<<sum << endl;
// cout << sum << endl;
}
cin >> M >> N;
}
system("pause");
return 0;
}