征税

Description
现在城市里有 nn 个人,每个人手上有三种物品 A,B,CA,B,C,第 ii 个人的 A,B,CA,B,C 三种物品的价值分别为 a_i,b_i,c_ia
i

,b
i

,c
i

,你需要向每个人收一份物品作为税收,你一共要获得 xx 份 AA,yy 份 BB 和 zz 份 CC。问你能够获得的最大价值是多少?
Input
第一行三个非负整数 x,y,zx,y,z​,令 n=x+y+zn=x+y+z​。
接下来 nn 行,每行三个整数 a_i,b_i,c_ia
i

,b
i

,c
i


Output
一行一个数,最大的价值。
Sample Input
3 2 5
3 8 10
6 8 6
6 3 10
9 7 1
10 9 10
6 4 10
1 7 4
5 4 1
7 5 1
10 9 5
Sample Output
83
Hint
30%30%​ 的数据:n \leq 10n≤10;
45%45%​ 的数据:n \leq 100n≤100;
另有15%另有15%​ 的数据:z=0z=0;
75%75%​ 的数据:n \leq 1000n≤1000;
100%100%​ 的数据:1\leq n\leq 10^51≤n≤10
5
​,1\leq a_i,b_i,c_i\leq 10^91≤a
i

,b
i

,c
i

≤10
9
​。
Source
2021CSP模拟题

Code:

#include <cstdio>
#include <algorithm>
#include <queue>

using namespace std;

typedef long long ll;

const int N=1e5+5;

int n,x,y,z;
ll sa[N],sb[N];
struct node
{
    int a,b,c;
}a[N];

bool cmp(node x,node y)
{
    return x.a-x.b>y.a-y.b;
}

int main()
{
    scanf("%d%d%d",&x,&y,&z);
    n=x+y+z;
    for(int i=1;i<=n;++i)scanf("%d%d%d",&a[i].a,&a[i].b,&a[i].c);

    sort(a+1,a+n+1,cmp);

    priority_queue<int> q;
    for(int i=1;i<=n-y+1;++i)
    {
        sa[i]=sa[i-1]+a[i].a;
        q.push(a[i].c-a[i].a);
        if(i>x)
        {
            sa[i]+=q.top();
            q.pop();
        }
    }

    while(q.size())q.pop();

    for(int i=n;i>=x;--i)
    {
        sb[i]=sb[i+1]+a[i].b;
        q.push(a[i].c-a[i].b);
        if(i<=n-y)
        {
            sb[i]+=q.top();
            q.pop();
        }
    }

    ll ans=0;
    for(int i=x;i<=n-y;++i)
        ans=max(ans,sa[i]+sb[i+1]);
    printf("%lld\n",ans);
    return 0;
}
posted @ 2022-10-28 22:21  FighterQ  阅读(117)  评论(0)    收藏  举报