zoukankan      html  css  js  c++  java
  • CodeForces 867C Ordering Pizza 贪心,思维

    CodeForces 867C

    题意:一个pizza 可以分成 s 块,有两种类型的 pizza 。有 n 个人,每个人要吃 si 块 pizza,且吃一块类型 1 的 pizza可以得到 ai 的价值,吃一块类型 2 的 pizza得到 bi 的价值。问:在订购 pizza 个数最少的情况下,求 n 个人能得到的最大价值。

    tags:一开始想到每个人取最大价值的类型,但没继续想了。。

    其实就是先假定每个取最大价值类型,然后看两种类型余下的个数是否可以用一个 pizza代替,再整一下就是了。

    #include<bits/stdc++.h>
    using namespace std;
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define rep(i,a,b) for (int i=a; i<=b; ++i)
    #define per(i,b,a) for (int i=b; i>=a; --i)
    #define mes(a,b)  memset(a,b,sizeof(a))
    #define INF 0x3f3f3f3f
    #define MP make_pair
    #define PB push_back
    #define fi  first
    #define se  second
    typedef long long ll;
    const int N = 200005;
    
    struct P { ll a, b, ab, s;
        bool friend operator < (P x, P y) {
            return x.ab<y.ab;
        }
    }p[N];
    ll n, cnt1, cnt2, s, ans;
    int main()
    {
        scanf("%lld%lld", &n, &s);
        rep(i,1,n)
        {
            scanf("%lld%lld%lld", &p[i].s, &p[i].a, &p[i].b);
            p[i].ab = p[i].a-p[i].b;
        }
        sort(p+1, p+1+n);
        rep(i,1,n)
        {
            if(p[i].a>p[i].b)
            {
                ans += p[i].a*p[i].s;
                cnt1 += p[i].s;
            }
            else
            {
                ans += p[i].b*p[i].s;
                cnt2 += p[i].s;
            }
        }
        cnt1%=s,  cnt2%=s;
        if(cnt1+cnt2 <= s)
        {
            ll  ans1=ans, ans2=ans, num;
            for(int i=n; cnt2 && i>=1; --i)
                if(p[i].ab<=0)
            {
                num = min(cnt2, p[i].s);
                ans1 += num*p[i].ab;
                cnt2 -= num;
            }
            for(int i=1; cnt1 && i<=n; ++i)
                if(p[i].ab>0)
            {
                num = min(cnt1, p[i].s);
                ans2 += num*(-p[i].ab);
                cnt1 -= num;
            }
            ans = max(ans1, ans2);
        }
        printf("%lld
    ", ans);
    
        return 0;
    }
  • 相关阅读:
    进程与线程
    闭包
    form表单提交
    让图片在div盒子中水平垂直居中
    第一个shell脚本——修改配置文件
    Linux系统find命令的常用方法
    Linux使echo命令输出结果带颜色
    Linux面试题
    无人值守批量安装
    Linux系统PXE高效批量网络装机的配置
  • 原文地址:https://www.cnblogs.com/sbfhy/p/7667232.html
Copyright © 2011-2022 走看看