链接
https://vjudge.net/problem/ZOJ-2109
题意
给你数量m的猫粮,共有n个仓库,每个仓库都有一个j和f,j代表数量f的猫粮可以兑换到的咖啡豆,问你最多可以兑换多少咖啡豆,保留三位小数;
分析
贪心,可以求出每个仓库单位猫粮可以兑换的咖啡豆,之后优先考虑那些单位质量兑换咖啡豆多的仓库,不断模拟兑换直至猫粮为0;
被精度问题恶心到了,具体看代码
代码
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <set>
#include <map>
using namespace std;
#define inf 0x7f7f7f7f
#define maxn 500005
#define mod 1000000007
#define N 200005
#define P 2
typedef long long ll;
int n, m;
struct Bean {
int j, f;
double avg;
} b[1005];
bool cmp(Bean a, Bean b) {
return a.j * b.f > b.j * a.f;
}
int main() {
while (scanf("%d%d", &m, &n) != EOF &&(n!= -1&&m!=-1)) {
for (int i = 1; i <= n; i++) {
cin >> b[i].j >> b[i].f;
b[i].avg = 1.0 * b[i].j / b[i].f;
}
sort(b + 1, b + 1 + n, cmp);
double res = 0;
for (int i = 1; i <= n && m > 0; i ++) {
//下面注释写的逻辑毫无问题,然而给wa
//这种题真的恶心,
//int k = min(m, b[i].f);
//res += 1.0 * k * b[i].avg;
//m -= k;
if(m <= b[i].f){
res += m * b[i].avg;
m -= m;
}else{
res += b[i].j;
m -= b[i].f;
}
}
printf("%.3lf\n", res);
}
}