征税
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;
}