F - Cake ZOJ - 3905
作者:互联网
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<set>
#include<queue>
#define maxn 1000000
using namespace std;
struct node {
int a;
int b;
}point[1005];
priority_queue <int> q;
bool cmp(node a, node b) {
return a.b > b.b;
}
int main() {
int t,n;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
for(int i=1;i<=n;i++) {
scanf("%d%d", &point[i].a, &point[i].b);
}
while (!q.empty()) {
q.pop();
}
sort( point + 1, point + 1 + n,cmp);
int sum = point[n].a;
for (int i = n - 1; i >= 1; i--) {
q.push(point[i].a);
if (i % 2 == 0)
{
sum += q.top();
q.pop();
}
}
cout << sum << endl;
}
system("pause");
return 0;
}
贪心
因为挑出两个蛋糕都是B先选,所以我们先根据b值进行排序。
排完序之后可以发现,第一个蛋糕必定属于b,最后一个蛋糕必定属于a。
前三个蛋糕,至少2个属于b,前五个蛋糕,至少3个属于b;
推出
后三个蛋糕,至少2个属于a,后5个蛋糕,至少3个属于a。所以要求suma的最大值,就是从后往前推,开个优先队列,每次丢两个进去,取a值最大的拿出来。
标签:node,3905,属于,point,int,ZOJ,蛋糕,Cake,include 来源: https://blog.csdn.net/qq_41539869/article/details/89044956