题目描述

垃圾分类快来了,垃圾场主某楠希望赶在垃圾分类之前将厂里的垃圾全部粉碎填埋。为此场长专门去租了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;
}
01-12 07:31