1. 程式人生 > >[題解]Mail.Ru Cup 2018 Round 1 - B. Appending Mex

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

【題目】

B. Appending Mex

【描述】

Ildar定義了一種方法,可以由一個數組產生一個數。具體地,從這個陣列中任選一個子集,不在這個子集中的最小的非負整數稱為mex,就是由這個陣列得到的數。初始時刻Ildar的陣列是一個空陣列,通過上述方法得到某個mex,加入到陣列的尾端,不斷重複以上操作。現在給你一個n長的陣列a,問Ildar能否得到這個陣列,如果能則輸出-1,否則輸出最小的整數t,表示陣列的前t個數中至少有一個數不能得到。

資料範圍:1<=n<=100000,0<=a[i]<=10^9

【思路】

要想得到數字0,可以選擇空集作為子集;要想得到數字k,選擇的子集必須包含{0,1,...,k-1}。於是,從前往後掃給的陣列a,當前的數字最多能比之前出現過的數字大1,否則這個數字是不能被得到的,當前位置就是t。

【我的實現】

 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

【評測結果】