• [题解]Mail.Ru Cup 2018 Round 1


    【题目】

    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

    【评测结果】

  • 相关阅读:
    超详细教程2021新版oracle官网下载Windows JAVA-jdk11并安装配置(其他版本流程相同)
    个人总结
    6.15 团队项目心得
    五月团队项目收获
    八大排序算法读书笔记
    设计模式读书笔记3
    设计模式读书笔记2
    结对编程收获
    设计模式读书笔记
    UI-12组结对编程作业总结
  • 原文地址:https://www.cnblogs.com/CQBZOIer-zyy/p/9815784.html
Copyright © 2020-2023  润新知