AGC018C Coins (set)
题目大意:
给出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)的更多相关文章
- [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 ...
 - 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 ...
 - 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 ...
 - csuoj 1119: Collecting Coins
		
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1119 1119: Collecting Coins Time Limit: 3 Sec Memo ...
 - Coins
		
Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One day Hi ...
 - hdu 1398 Square Coins (母函数)
		
Square Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
 - (混合背包 多重背包+完全背包)The Fewest Coins (poj 3260)
		
http://poj.org/problem?id=3260 Description Farmer John has gone to town to buy some farm supplies. ...
 - POJ3260The Fewest Coins[背包]
		
The Fewest Coins Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6299 Accepted: 1922 ...
 - POJ1742 Coins[多重背包可行性]
		
Coins Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 34814 Accepted: 11828 Descripti ...
 
随机推荐
- 操作BOM
			
BOM的作用是将相关的元素组织包装起来,提供给程序设计人员使用,从而降低开发人员的劳动量,提高设计Web页面的能力. 整个window对象是整个BOM的核心. 通过BOM可实现的功能: 弹出新的浏览器 ...
 - php面向对象基础知识整理之类中的属性和方法的使用
			
<?php /** * class Index * 类包含什么 * 1.创建类 * 2.类的属性和类中方法 * 3.类中访问修饰符 * 4.类的封装.继承.多态 */ // 创建类,创建的类名是 ...
 - Asp.NET Core 在IIS部署 An assembly specified in the application dependencies manifest was not found
			
今天在发布应用的时候,出来了一个报错:An assembly specified in the application dependencies manifest was not found 情况如下 ...
 - 在一台Apache服务器上创建多个站点(不同域名)
			
使用不同的域名来区分不同的网站,所有的域名解析都指向同一个 IP 地址.Apache通过在HTTP头中附带的 host参数来判断用户需要访问哪一个网站. 例如要在一台服务器上设置如下两个站点: htt ...
 - JAVA Web 项目中用到的技术
			
JSPServletTomcatMySQL MavenSpringMVCHibernatejQueryBootstrapAngularJSBootStrap Table 下边两个是移动APP开发要用到 ...
 - Spring 的好处?
			
1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监 ...
 - Android开发——View动画、帧动画和属性动画详解
			
0. 前言 Android动画是面试的时候经常被问到的话题.我们都知道Android动画分为三类:View动画.帧动画和属性动画. 先对这三种动画做一个概述: View动画是一种渐进式动画,通过图 ...
 - mongodb 安装使用遇到的问题记录
			
mongodb 常用命令: https://www.mongodb.org/downloads 官网64位下载链接 https://fastdl.mongodb.org/linux/mongodb-l ...
 - jmeter更改启动编码设置
			
项目中碰到这样的问题,在eclipse经过utf-8转码的代码,能正常运行,放到了jmeter里面运行,就是乱码,如下: String s = "乔佳飞"; String ss = ...
 - Android当代码方法超过65536个时,在2.3机器上会不能安装,出现INSTALL_FAILED_DEXOPT错误
			
今天打包时,发现2.3机器,产生的APK在某些机器上不能安装(Installation error: INSTALL_FAILED_DEXOPT),针对这个问题的一个可能解释是:最新的ADT和SDK ...