【刷题】BZOJ 4391 [Usaco2015 dec]High Card Low Card
Description
Bessie the cow is a huge fan of card games, which is quite surprising, given her lack of opposable thumbs. Unfortunately, none of the other cows in the herd are good opponents. They are so bad, in fact, that they always play in a completely predictable fashion! Nonetheless, it can still be a challenge for Bessie to figure out how to win.
Bessie and her friend Elsie are currently playing a simple card game where they take a deck of 2N cards, conveniently numbered 1…2N, and divide them into N cards for Bessie and N cards for Elsie. The two then play NN rounds, where in each round Bessie and Elsie both play a single card. Initially, the player who plays the highest card earns a point. However, at one point during the game, Bessie can decide to switch the rules so that for the rest of the game, the player who plays the lowest card wins a point. Bessie can choose not to use this option, leaving the entire game in "high card wins" mode, or she can even invoke the option right away, making the entire game follow the "low card wins" rule.
Given that Bessie can predict the order in which Elsie will play her cards, please determine the maximum number of points Bessie can win.
奶牛Bessie和Elsie在玩一种卡牌游戏。一共有2N张卡牌,点数分别为1到2N,每头牛都会分到N张卡牌。
游戏一共分为N轮,因为Bessie太聪明了,她甚至可以预测出每回合Elsie会出什么牌。
每轮游戏里,两头牛分别出一张牌,点数大者获胜。
同时,Bessie有一次机会选择了某个时间点,从那个时候开始,每回合点数少者获胜。
Bessie现在想知道,自己最多能获胜多少轮?
Input
The first line of input contains the value of N (2≤N≤50,000).
The next N lines contain the cards that Elsie will play in each of the successive rounds of the game. Note that it is easy to determine Bessie's cards from this information.
Output
Output a single line giving the maximum number of points Bessie can score.
Sample Input
4
1
8
4
3
Sample Output
3
HINT
Here, Bessie must have cards 2, 5, and 6, and 7 in her hand, and she can use these to win at most 3 points. For example, she can defeat the 1 card and then switch the rules to "low card wins", after which she can win two more rounds.
Solution
怎么说,贪心的题都不知道怎么去讲
首先,对于单个数,我们要赢它,那么肯定是在自己的数的集合中选一个大于它的最小的数,或者是小于它的最大的数(取决在哪一段)
这是单个数的贪心
然后求出 \(f\) 数组,\(f_i\) 代表从前往后到第 \(i\) 个数,赢的方式必须是大于的情况下,最多能赢多少把
同时求出 \(g\) 数组,\(g_i\) 代表从后往前到第 \(i\) 个数,赢的方式必须是小于的情况下,最多能赢多少把
那么最后的答案就是 \(\max_{i=0}^n\{f_i+g_{i+1}\}\)
为什么是这样,这样有的数不是用了两次吗
确实有的数用了两次,但考虑这样的事实:
如果一个数用了两次,那么肯定有一个数未被使用。
用了两次的数一定是 \(f\) 中用一次,\(g\) 中用一次,同一段中不可能用两次
设用了两次的数为 \(a\) ,未用的数为 \(b\) 。如果 \(a<b\) ,那么 \(b\) 是可以代替 \(a\) 在比更大的那一段取得胜利的;相反同理。
而我们已经最大化了 \(f\) 数组和 \(g\) 数组,所以这一定是正确的
求两个数组,就用个set维护就好了
#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=50000+10;
int n,vis[MAXN<<1],a[MAXN],f[MAXN],g[MAXN],cnt,ans;
std::set<int> S;
std::set<int>::iterator it;
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
int main()
{
read(n);
for(register int i=1;i<=n;++i)read(a[i]),vis[a[i]]=1;
for(register int i=1;i<=(n<<1);++i)
if(!vis[i])S.insert(i);
for(register int i=1;i<=n;++i)
if((it=S.lower_bound(a[i]))!=S.end())f[i]=++cnt,S.erase(it);
else f[i]=f[i-1];
S.clear();cnt=0;
for(register int i=1;i<=(n<<1);++i)
if(!vis[i])S.insert(i);
for(register int i=n;i>=1;--i)
if(((it=S.lower_bound(a[i]))--)!=S.begin())g[i]=++cnt,S.erase(it);
else g[i]=g[i+1];
for(register int i=0;i<=n;++i)chkmax(ans,f[i]+g[i+1]);
write(ans,'\n');
return 0;
}
【刷题】BZOJ 4391 [Usaco2015 dec]High Card Low Card的更多相关文章
- 【BZOJ4391】[Usaco2015 dec]High Card Low Card(贪心)
[BZOJ4391][Usaco2015 dec]High Card Low Card(贪心) 题面 BZOJ 题解 预处理前缀后缀的结果,中间找个地方合并就好了. #include<iostr ...
- 【题解】P3129高低卡(白金)High Card Low Card
[题解][P3129 USACO15DEC]高低卡(白金)High Card Low Card (Platinum) 考虑贪心. 枚举在第几局改变规则,在改变规则之前,尽量出比它大的最小的牌,在改变规 ...
- BZOJ 4390: [Usaco2015 dec]Max Flow
4390: [Usaco2015 dec]Max Flow Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 177 Solved: 113[Submi ...
- bzoj 4397: [Usaco2015 dec]Breed Counting -- 前缀和
4397: [Usaco2015 dec]Breed Counting Time Limit: 10 Sec Memory Limit: 128 MB Description Farmer John ...
- 【dp 贪心】bzoj4391: [Usaco2015 dec]High Card Low Card
巧妙的贪心 Description Bessie the cow is a huge fan of card games, which is quite surprising, given her l ...
- [BZOJ4391][Usaco2015 dec]High Card Low Card dp+set+贪心
Description Bessie the cow is a huge fan of card games, which is quite surprising, given her lack of ...
- [USACO15DEC]高低卡(白金)High Card Low Card (Platinum)
题目描述 Bessie the cow is a hu e fan of card games, which is quite surprising, given her lack of opposa ...
- BZOJ4391 High Card Low Card [Usaco2015 dec](贪心+线段树/set库
正解:贪心+线段树/set库 解题报告: 算辣直接甩链接qwq 恩这题就贪心?从前往后从后往前各推一次然后找一遍哪个地方最大就欧克了,正确性很容易证明 (这里有个,很妙的想法,就是,从后往前推从前往后 ...
- [bzoj4391] [Usaco2015 dec]High Card Low Card 贪心 线段树
---题面--- 题解: 观察到以决策点为分界线,以点数大的赢为比较方式的游戏都是它的前缀,反之以点数小的赢为比较方式的都是它的后缀,也就是答案是由两段答案拼凑起来的. 如果不考虑判断胜负的条件的变化 ...
随机推荐
- odoo之可选择多个内容显示问题
<field name="partner_id" widget="many2many_tags" options="{'no_create': ...
- python_基础语法
开始正式接触python的语法: 1. 2.
- 20155204 王昊《网络对抗技术》EXP3
20155204 王昊<网络对抗技术>EXP3 一.基础问题回答 1.杀软是如何检测出恶意代码的? 答: 基于特征码:一段特征码就是一段或多段数据.(如果一个可执行文件(或其他运行的库.脚 ...
- 20155308《信息安全系统设计基础 嵌入式C语言课堂考试补博客
20155308<信息安全系统设计基础 嵌入式C语言课堂考试补博客 知识点 置位 ?bits = bits | (1 << 7) ; /* sets bit 7 */ bits |= ...
- controlfile 备份到trace文件例子
主要是为了学习oracle的克隆.参考: http://www.dba-oracle.com/oracle_tips_db_copy.htm 执行: SQL>alter database bac ...
- JavaScript中call,apply,bind方法的区别
call,apply,bind方法一般用来指定this的环境. var a = { user:"hahaha", fn:function(){ console.log(this.u ...
- vs2013 std::sort 分析
由于之前在debug模式下发现stl的sort简直慢到不能忍,所以自己写了一个sgi的sort,后来发现在release模式下,vs自带的sort快的不行,就研究了下. 这里有些和sgi-stl相通的 ...
- if 判断文件
#!/bin/sh#判断文件存在,判断是否为文件夹等testPath="/Volumes/MacBookProHD/Mr.Wen/08 shell命令"testFile=" ...
- idou老师教你学Istio: 如何用Istio实现K8S Egress流量管理
本文主要介绍在使用Istio时如何访问集群外服务,即对出口流量的管理. 默认安装的Istio是不能直接对集群外部服务进行访问的,如果需要将外部服务暴露给 Istio 集群中的客户端,目前有两种方案: ...
- PHP 观察者模式和php实现 Observer Pattern
观察者模式: 观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式又叫做发布-订阅(Publ ...