Codeforces Round 858:B. Mex Master
Posted Arno_vc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round 858:B. Mex Master相关的知识,希望对你有一定的参考价值。
一、来源:Problem - B - Codeforces
二、题面
三、思路
-
题面:n个非负正数,随机排列并由相邻两个数相加构成
n-1
个数并进行升序排列,求从0开始的第一个MEX(Minimum Excluded) -
两种思考模型:
首先可知0的数至少要过一半,接下来
- 递归:考虑1是否能以相同情况考虑,失败
- 分类讨论:有限类
-
考虑了大部分情况,主要说几个错误点
- 对于0的分布
- 初始想法是只要0能被全包裹,则MEX=0,将
0 0 1
考虑为了一个特例 - 实际上,将
0 0 1
例扩展,只要0的个数小于等于1的个数最终结果即为0
- 初始想法是只要0能被全包裹,则MEX=0,将
- 对于一边比另一边多一个:还是简化为超过一半的好
- 基于0的个数已经超过
n/2
,不可能出现3的情况
- 对于0的分布
四、代码
#include <bits/stdc++.h>
#define eleType int
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int N=2e5+10;
eleType arr[N];
int main()
int t;
cin >> t;
while(t--)
// code
int n;
cin >> n;
memset(arr,0,sizeof(int)*N);
for(int i=0;i<n;i++)
int temp;
cin >> temp;
arr[temp]++;
// 0 0 1模型可以延伸,0 0 1 1 0也是0,因此想要MEX=0,则的0个数<=(n+1)/2
int ans=0,left=n-arr[0];
if((n+1)/2<arr[0]) //一边比另一边多一个:可以将逻辑简化为超过一半
if(left==0)
ans=1;
else if(left==arr[1])
// if(arr[1]==1)
ans=2;
//
// else
// ans=3; //不可能有3,因为1一件超过一半了,所以至少能将1拆开
//
else
ans=1;
else
ans=0;
cout << ans << endl;
return 0;
以上是关于Codeforces Round 858:B. Mex Master的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #316 (Div. 2) B. Simple Game
Codeforces Round #245 (Div. 1) B. Working out (简单DP)
codeforces cf edu round#50 B. Diagonal Walking v.2
Educational Codeforces Round #52 B. Vasya and Isolated Vertices
Codeforces Round #732 (Div. 2) B. AquaMoon and Stolen String 题解
Codeforces Round #593 (Div. 2) B. Alice and the List of Presents