20180527模拟赛T1——新田忌赛马
【问题描述】
(注:此题为d2t2-难度)
田忌又在跟大王van赛马的游戏
田忌与大王一共有2n匹马,每个马都有一个能力值x,1<=x<=2n且每匹马的x互不相同。每次田忌与大王放出一匹马,较大的获胜。但是田忌有一个能力,在任何比赛的开始前,他可以把马变成x较小的获胜,并一直持续到比赛结束
田忌可以一直不用这个能力,也可以在第一轮前使用
现在,田忌已经知道了大王的出马顺序,田忌要问聪明的你,他最多能获得几次胜利?
【输入格式】
第一行为一个整数:N(1<=N<=50000)接下来 一行n个数,为大王的顺序出场的n匹马的能力值(田忌的马可以通过此求出)
【输出格式】
一个整数,表示最多的获胜次数
【样例输入】
4
1
8
4
3
【样例输出】
3
【样例说明】
田忌第一次出能力为7的马获胜
第二次开始前使用能力,出能力为6的马获胜
第三次出能力为5的马失败
第四次出能力为2的马获胜
总共3次
【出题人的关怀】
乱搞出奇迹(雾)
大胆猜想,不要证明
【数据规模】
对于20%的数据,n<=10
对于40%的数据 n<=20
对于35%的数据,不使用能力也可获得最多胜利(即20个点中有7个点不使用能力的程序能过(雾))
前3个档的总分为60分(出题人的关怀)
对于80%的数据,n<=5000
对于100%的数据,n<=50000,
【一些帮助】
题解
先贴一下出题人yk神犇的题解。
另外这位大佬在洛谷上也发了题解。
接下来是蒟蒻的题解:
首先,回顾田忌赛马,我们发现tj是每次出比大王稍微快一些的马(如果有的话)。那么如果tj用了技能,他显然应该出比大王稍微慢一些的马。于是我们就可以很容易知道tj不用技能或是刚开始就用技能的最佳方案。
我们令\(f[i]\)表示前\(i\)个每次都出比对方稍微大一点的牌,最多能赢几次;\(g[i]\)表示从\([i,n]\)中每次出比对方稍微小一点的牌,最多赢几次。
我们自然想到\(ans = max(f[i]+g[i+1]\mid i\in [0,n])\),但这样显然是有重复的。
那么这样真的不可行吗?让我们冷静分析一下:

如图,对于一个\(i\),如果有一匹马\(mid\)被选了两次:\(f\)数组对\(l\),\(g\)数组对\(r\)。那么必定有一匹马没被\(f\)与\(g\)用过(多出来了),设其能力值为\(t\)。显然,\(t\notin[l,r]\)(不符合贪心规则)。不管这匹马在\(l\)左侧或是\(r\)的右侧,结果都是相同的。所以其实这个贪心思路是正确的。
代码
#include <cstdio>
#include <cctype>
#include <set>
using namespace std;
const int maxn = 50005;
int f[maxn], g[maxn];
int n;
#define dd c = getchar()
inline int read(int& x)
{
x = 0;
char dd;
bool f = false;
for(; !isdigit(c); dd)
{
if(c == '-')
f = true;
if(c == EOF)
return EOF;
}
for(; isdigit(c); dd)
x = (x<<1) + (x<<3) + (c^48);
if(f) x = -x;
return 1;
}
#undef dd
set<int> zheng, fan;
set<int>::iterator z;
int dw[maxn];
bool whose[maxn<<1];
inline void get()
{
read(n);
for(int i = 1; i <= n; ++i)
{
read(dw[i]);
whose[dw[i]] = true;
}
for(int i = 1; i <= (n<<1); ++i)
{
if(!whose[i])
{
zheng.insert(i);
fan.insert((n<<1)-i);
}
}
}
int main()
{
freopen("horse.in", "r", stdin);
freopen("horse.out", "w", stdout);
get();
for(int i = 1; i <= n; ++i)
{
z = zheng.upper_bound(dw[i]);
if(z != zheng.end())
{
f[i] = f[i-1] + 1;
zheng.erase(z);
}
else
f[i] = f[i-1];
}
for(int i = n; i >= 1; --i)
{
z = fan.upper_bound((n<<1)-dw[i]);
if(z != fan.end())
{
g[i] = g[i+1] + 1;
fan.erase(z);
}
else
g[i] = g[i+1];
}
int ans = 0;
for(int i = 0; i <= n; ++i)//注意从0开始,可以不用技能
ans = max(ans, f[i]+g[i+1]);
printf("%d", ans);
return 0;
}
20180527模拟赛T1——新田忌赛马的更多相关文章
- 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解
今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...
- 20180610模拟赛T1——脱离地牢
Description 在一个神秘的国度里,年轻的王子Paris与美丽的公主Helen在一起过着幸福的生活.他们都随身带有一块带磁性的阴阳魔法石,身居地狱的魔王Satan早就想着得到这两块石头了,只要 ...
- NOIP欢乐模拟赛 T1 解题报告
小澳的方阵 (matrix.cpp/c/pas) [题目描述] 小澳最近迷上了考古,他发现秦始皇的兵马俑布局十分有特点,热爱钻研的小澳打算在电脑上还原这个伟大的布局. 他努力钻研,发现秦始皇布置兵马俑 ...
- [模拟赛] T1 高级打字机
Description 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小 ...
- 2019.2.25 模拟赛T1【集训队作业2018】小Z的礼物
T1: [集训队作业2018]小Z的礼物 我们发现我们要求的是覆盖所有集合里的元素的期望时间. 设\(t_{i,j}\)表示第一次覆盖第i行第j列的格子的时间,我们要求的是\(max\{ALL\}\) ...
- [NOIP2018校模拟赛]T1 阶乘
题目: 描述 有n个正整数a[i],设它们乘积为p,你可以给p乘上一个正整数q,使p*q刚好为正整数m的阶乘,求m的最小值. 输入 共两行. 第一行一个正整数n. 第二行n个正整数a[i]. 输出 共 ...
- [NOIP2018校模拟赛]T1聚会 party
题目链接: 聚会 分析: 设每个点到1号点的距离为dist_{i},每个点的权值为x_{i},目标点到1号点的距离为dist,权值为x,那么对于每一次查询,我们讨论三种情况: ① 目标家庭在区间左边( ...
- 【2019.8.15 慈溪模拟赛 T1】插头(plugin)(二分+贪心)
二分 首先,可以发现,最后的答案显然满足可二分性,因此我们可以二分答案. 然后,我们只要贪心,就可以验证了. 贪心 不难发现,肯定会优先选择能提供更多插座的排插,且在确定充电器个数的情况下,肯定选择能 ...
- 【2019.7.20 NOIP模拟赛 T1】A(A)(暴搜)
打表+暴搜 这道题目,显然是需要打表的,不过打表的方式可以有很多. 我是打了两个表,分别表示每个数字所需的火柴棒根数以及从一个数字到另一个数字,除了需要去除或加入的火柴棒外,至少需要几根火柴棒. 然后 ...
随机推荐
- Java中的数据类型与运算符
一.变量的命名 (1)什么是变量:变量是java中存储数据的空间. (2)变量命名的规则:由:数(数字),字(字母),下(下划线),美(美元符号),人(人名币符号)组成的标识符.注:数字不能作为首字母 ...
- Python3+WebSockets实现WebSocket通信
一.说明 1.1 背景说明 前段时间同事说云平台通信使用了个websocket的东西,今天抽空来看一下具体是怎么个通信过程. 从形式上看,websocket是一个应用层协议,socket是数据链路层. ...
- [转帖]如何获得一个Oracle RAC数据库(从Github - oracle/vagrant-boxes) --- 暂时未测试成功 公司网络太差了..
如何获得一个Oracle RAC数据库(从Github - oracle/vagrant-boxes) 2019-11-20 16:40:36 dingdingfish 阅读数 5更多 分类专栏: 如 ...
- [转帖]AWR报告参数:DB TIME和DB CPU
AWR报告参数:DB TIME和DB CPU http://blog.itpub.net/12679300/viewspace-1182396/ 一.前言:AWR报告是了解ORACLE运行的一个重要报 ...
- 开源分布式数据库中间件 DBLE
DBLE 是企业级开源分布式中间件,江湖人送外号 “MyCat Plus”:以其简单稳定,持续维护,良好的社区环境和广大的群众基础得到了社区的大力支持: DBLE官方网站:https://openso ...
- DDR3(3):写控制
调取的 DDR3 控制器给用户端预留了接口,用于实现对该 IP 核的控制,本篇介绍一下 DDR3 IP核写.在生成 DDR3 IP 核的界面中,可以找到 User Guide 手册,DDR3 的使用将 ...
- docker搭建etcd集群环境
其实关于集群网上说的方案已经很多了,尤其是官网,只是这里我个人只有一个虚拟机,在开发环境下建议用docker-compose来搭建etcd集群. 1.拉取etcd镜像 docker pull quay ...
- k8s部署nacos之二 nfs
1.在linux服务器下载nacos 首先安装git命令 yum install git git clone https://github.com/nacos-group/nacos-k8s.git ...
- C#使用HttpWebRequest发送数据和使用HttpWebResponse接收数据的一个简单示例
新建一个.NET Core控制台项目,代码如下所示: using System; using System.Text; using System.Net; using System.Collectio ...
- 如何在pycharm中设置环境变量
今天运行tensorflow的时候,发现在pycharm下,程序无法找到CUDA的libcupti.so文件.而在添加完环境变量: export LD_LIBRARY_PATH=$LD_LIBRARY ...