题目描述
垃圾分类快来了,垃圾场主某楠希望赶在垃圾分类之前将厂里的垃圾全部粉碎填埋。为此场长专门去租了n台垃圾粉碎机,每种垃圾粉碎机都有一个最长使用时间ti,在这段时间里总共可以处理mi吨垃圾,可以在任意时间使用任意时长,但是用完就不能再用。由于场里太穷,同一时间只能运行一台垃圾粉碎机,现在想问在垃圾分类来临之前,最多能粉碎多少垃圾。为了简化计算,所有时间单位以小时计算。
输入
前两个数为垃圾粉碎机的个数N和距离垃圾分类来临时间T小时
接下来N行每行2个整数,对应的ti和mi
所有数字均不大于1e5
输出
输出一行,能处理的垃圾最大重量,保留2位小数,单位为吨
输入样例
1 2 2 3
输出样例
3.00
代码- -
标准贪心,可贪可贪了
选出ti/mi最大的,每次就先把它用完
如果装不下了,那就装一部分
#include <iostream> #include <stdio.h> #include <algorithm> using namespace std; struct Goods { int v,w; double p; } g[100005]; int cmp(struct Goods x,struct Goods y) { return x.p>y.p; } int main() { int N, V; double sum = 0; cin>>N>>V; for(int i = 0; i < N ; i++) { cin >>g[i].w >> g[i].v; g[i].p = (double)g[i].v / (double)g[i].w; } sort(g,g+N,cmp); for(int i = 0; i < N ; i++) { if(V >= g[i].w) { V -= g[i].w; sum += g[i].v; } else { sum += (double)(V * g[i].p); break; } } printf("%.2lf\n",sum); return 0; }