题目大意:

给出n个人,每个人手里都有xi个金牌,yi个银牌,ci个铜牌。

你需要选出X个人,拿走他们手里的金牌,选出Y个人,拿走他们手里的银牌,选出Z个人,拿走他们手里的铜牌

X+Y+Z = n。并且选的这X,Y,Z个人里不能有重复的。

题解:

不妨先考虑只有金牌和银牌怎么做。

如果只有两种,就变成很简单的贪心了,依据每个人手中的金牌数x减去银牌数y然后排序,按差值选即可

现在又多了一个铜牌,我们还是按照这个思路

依据每个人手中的金牌数x减去银牌数y然后排序。

然后我们考虑如何分配我们的X和Y。

注意到,排完序以后,这里有一个奇妙的性质出现了

这个性质简单来说就是,银牌从排序靠前的元素选,金牌从排序靠后的元素选,这样做会更优

或者这样说,银牌和金牌的选择是互不交叉的。(考虑如果有交叉,那么相互交换一下会更优)

那么我们就可以这样求出答案

枚举一个k,从前k个元素中选出Y个银牌,从后n-k个元素中选出X个金牌,其他都是选铜牌

这样我们只需要把k从Y枚举到n-X就可以了

那铜牌的影响怎么处理呢?

就让金牌数和银牌数直接减去铜牌数,然后最后的答案加上铜牌数,这样所有的铜牌数就变成了0

就可以不考虑它的影响了。

对每一个k,答案就是前k个元素中最大的Y个银牌数和,加上后n-k个元素中最大的X个银牌数和

这个显然可以用set来维护。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <set>
#include <map>
#define fi first
#define se second
using namespace std;
const int maxn = 1e5 + ;
typedef pair<int, int> PII;
bool cmp(const PII &A, const PII &B){
return A.fi - A.se < B.fi - B.se;
}
PII a[maxn];
set<int> S[];
map<int, int> H[];
int ssz[], sz[];
long long ans = , temp, ans1[maxn], ans2[maxn];
void Erase(int x, int ty){
if(H[ty][x] == ) S[ty].erase(x);
H[ty][x]--;
ans -= x;
ssz[ty]--;
}
void Insert(int x, int ty){
if(H[ty][x] == ) S[ty].insert(x);
H[ty][x]++;
ans += x;
ssz[ty]++;
} void S_Insert(int x, int ty){
if(ssz[ty] == sz[ty]){
int y = *S[ty].begin();
if(y > x) return;
Erase(y, ty);
}
Insert(x, ty);
} int main()
{
int X, Y, Z, x, y, z;
cin>>X>>Y>>Z;
int n = X+Y+Z;
for(int i = ; i <= n; i++){
scanf("%d %d %d", &x, &y, &z);
x -= z;
y -= z;
ans += z;
a[i].fi = x;
a[i].se = y;
}
temp = ans;
ans = ;
sort(a+, a++n, cmp);
sz[] = Y; sz[] = X;
for(int i = ; i <= Y; i++) S_Insert(a[i].se, );
ans1[Y] = ans;
for(int i = Y+; i <= n-X; i++){
S_Insert(a[i].se, );
ans1[i] = ans;
}
ans = ;
for(int i = n; i >= n-X+; i--) S_Insert(a[i].fi, );
ans2[n-X+] = ans;
for(int i = n-X; i >= Y+; i--){
S_Insert(a[i].fi, );
ans2[i] = ans;
}
ans = -1e18;
for(int i = Y; i <= n-X; i++) ans = max(ans, ans1[i]+ans2[i+]);
cout<<ans+temp<<endl;
return ;
}

AGC018C Coins (set)的更多相关文章

  1. [LeetCode] Arranging Coins 排列硬币

    You have a total of n coins that you want to form in a staircase shape, where every k-th row must ha ...

  2. ACM: Gym 101047M Removing coins in Kem Kadrãn - 暴力

     Gym 101047M Removing coins in Kem Kadrãn Time Limit:2000MS     Memory Limit:65536KB     64bit IO Fo ...

  3. Codeforces 2016 ACM Amman Collegiate Programming Contest A. Coins(动态规划/01背包变形)

    传送门 Description Hasan and Bahosain want to buy a new video game, they want to share the expenses. Ha ...

  4. csuoj 1119: Collecting Coins

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1119 1119: Collecting Coins Time Limit: 3 Sec  Memo ...

  5. Coins

    Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One day Hi ...

  6. hdu 1398 Square Coins (母函数)

    Square Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  7. (混合背包 多重背包+完全背包)The Fewest Coins (poj 3260)

    http://poj.org/problem?id=3260   Description Farmer John has gone to town to buy some farm supplies. ...

  8. POJ3260The Fewest Coins[背包]

    The Fewest Coins Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6299   Accepted: 1922 ...

  9. POJ1742 Coins[多重背包可行性]

    Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 34814   Accepted: 11828 Descripti ...

随机推荐

  1. idea中创建web项目搭建Hibernate框架连接oracle数据库

    hibernate框架 hibernate是数据化持久工具,也是一个开源代码的ORM解决方案.hibernate内部封装了通过jdbc访问数据库的操作,向商场应用提供面向对象的数据访问api. hib ...

  2. 一个新晋IT行业的努力Duiker

      亲爱的朋友,你好!   我很开心能以这么一篇博客来开始我的IT努力之路.我叫Duiker,是一名软件工程专业的学生,想通过写博客来提升自己,充实自我. 首先,我要确立自己的学习编程目标: 1.将算 ...

  3. Python3爬虫(六) 解析库的使用之Beautiful Soup

    Infi-chu: http://www.cnblogs.com/Infi-chu/ Beautiful Soup 借助网页的结构和属性等特性来解析网页,这样就可以省去复杂的正则表达式的编写. Bea ...

  4. 38-JWT 设计解析及定制

    可去官网下载Security项目查看源码 只需修改 AddJwtBearer中的行为即可 public void ConfigureServices(IServiceCollection servic ...

  5. 3,jieba gensim 最好别分家之最简单的相似度实现

    简单的问答已经实现了,那么问题也跟着出现了,我不能确定问题一定是"你叫什么名字",也有可能是"你是谁","你叫啥"之类的,这就引出了人工智能 ...

  6. JQuery中的load()、$.get()和$.post()详解 (转)

    load() 1.载入HTML文档 load()方法是jQuery中最为简单和常用的Ajax方法,能载入远程HTML代码并插入DOM中. 它的结构为: load(url [,data][,callba ...

  7. LeetCode:5. Longest Palindromic Substring(Medium)

    原题链接:https://leetcode.com/problems/longest-palindromic-substring/description/ 1. 题目要求:找出字符串中的最大回文子串 ...

  8. Error: Error while compiling statement: FAILED: SemanticException Unable to determine if hdfs://hadoopNode2:8020/user/hive/warehouse/test is encrypted...

    1.发现问题: 在hive客户端或者beeline查询hive表时候报错: 根据报错信息查看,是在集群namenode做了HA之后,产生的hdfs路径不对的问题: 2.解决问题,修改hive元数据my ...

  9. Java RMI 入门指南

    开通博客也有好些天了,一直没有时间静下心来写博文,今天我就把两年前整理的一篇关于JAVA RMI入门级文章贴出来,供有这方面需要的同学们参考学习. RMI 相关知识 RMI全称是Remote Meth ...

  10. Cadence17.2下载ALTERA的FPGA封装库

    1. 在Cadence的安装目录里面找了下,发现都没有Altera的FPGA型号的函数库,下面的虽然是ALTERA,但是没有FPGA的器件封装 2. 去intel的官网看能不能下载到,INTEL网址, ...