[题解]Mail.Ru Cup 2018 Round 1 - B. Appending Mex

【题目】ios

B. Appending Mex数组

【描述】ide

Ildar定义了一种方法,能够由一个数组产生一个数。具体地,从这个数组中任选一个子集,不在这个子集中的最小的非负整数称为mex,就是由这个数组获得的数。初始时刻Ildar的数组是一个空数组,经过上述方法获得某个mex,加入到数组的尾端,不断重复以上操做。如今给你一个n长的数组a,问Ildar可否获得这个数组,若是能则输出-1,不然输出最小的整数t,表示数组的前t个数中至少有一个数不能获得。spa

数据范围:1<=n<=100000,0<=a[i]<=10^9code

【思路】blog

要想获得数字0,能够选择空集做为子集;要想获得数字k,选择的子集必须包含{0,1,...,k-1}。因而,从前日后扫给的数组a,当前的数字最多能比以前出现过的数字大1,不然这个数字是不能被获得的,当前位置就是t。get

【个人实现】string

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 
 7 using namespace std;
 8 #define MaxN 100020
 9 int a[MaxN];
10 
11 int main()
12 {
13     int n, x;
14     int cur = -1;
15     scanf("%d", &n);
16     for(int i = 1; i <= n; i++)
17     {
18         scanf("%d", &x);
19         if(x > cur + 1)
20         {
21             printf("%d", i);
22             return 0;
23         }
24         cur = max(cur, x);
25     }
26     printf("-1");
27     return 0;
28 }
View Code

【评测结果】it

相关文章
相关标签/搜索