P2240 【深基12.例1】部分背包问题(贪心)难度⭐

题目链接
P2240 【深基12.例1】部分背包问题(贪心)难度⭐_第1张图片
很经典的一道贪心题,今天在洛谷上刷到了,就再做一遍
竟然是道黄题,赶紧水一下
没想到竟然WA了一次,确实提醒了我一下,写题的时候别手贱
思路就是一个简单的贪心,按照性价比来排序,因为金币是可以分开的所以拿不完就拿一部分
还有就是其实有除的话尽量推公式换成乘法,除容易有误差但这道题数据太水了 数据的类型转换还是要注意的
以及double的数比较大小的时候别忘了有误差,浮点数相等应该是这种形式:a-b<1e-6 别忘了。

#include
using namespace std;
typedef long long ll;
const ll N=1e4+7;
const ll mod=2147483647;
struct node
{
    ll m,v;
    double w;//性价比
    bool operator<(const node &a)const//排序
    {
        return w>a.w;
    }
}f[N];
ll n,m,t;
int main()
{
    scanf("%lld %lld",&n,&t);
    for(int i=1;i<=n;++i)
    {
        scanf("%lld %lld",&f[i].m,&f[i].v);
        f[i].w=(double)f[i].v/(double)f[i].m;//注意类型转换
    }
    sort(f+1,f+1+n);
    double sum=0.0;
    ll now=0;
    for(int i=1;i<=n;++i)
    {
        if(f[i].m+now<=t)
        {
            sum+=(double)f[i].v,now+=f[i].m;
            if(now==t)break;
        }
        else {
                sum+=double(t-now)*f[i].w;
                break;
        }
    }
    printf("%.2f\n",sum);//就不该放到里面
    return 0;
}

你可能感兴趣的:(#,贪心)