集训第一天,有段时间没有敲代码,被虐得体无完肤……
比完后仔细看看题解,哎……还是自己水平太水。不管怎么样,集训第一天,不管前路多么坎坷,以最大的决心和努力奋斗就好。
话不多说,上题:
Someone gave Alyona an array containing n positive integers a1, a2, ..., an. In one operation, Alyona can choose any element of the array and decrease it, i.e. replace with any positive integer that is smaller than the current one. Alyona can repeat this operation as many times as she wants. In particular, she may not apply any operation to the array at all.
Formally, after applying some operations Alyona will get an array of n positive integers b1, b2, ..., bn such that 1 ≤ bi ≤ ai for every1 ≤ i ≤ n. Your task is to determine the maximum possible value of mex of this array.
Mex of an array in this problem is the minimum positive integer that doesn't appear in this array. For example, mex of the array containing 1, 3 and 4 is equal to 2, while mex of the array containing 2, 3 and 2 is equal to 1.
The first line of the input contains a single integer n (1 ≤ n ≤ 100 000) — the number of elements in the Alyona's array.
The second line of the input contains n integers a1, a2, ..., an (1 ≤ ai ≤ 109) — the elements of the array.
Print one positive integer — the maximum possible value of mex of the array after Alyona applies some (possibly none) operations.
5 1 3 3 3 6
5
2 2 1
3
In the first sample case if one will decrease the second element value to 2 and the fifth element value to 4 then the mex value of resulting array 1 2 3 3 4 will be equal to 5.
To reach the answer to the second sample case one must not decrease any of the array elements.
//运用贪心法 使所有数字变换成连续的非递减的 末尾数字加一 即为所求最大
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn=100001;
int a[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
sort(a,a+n);
int res=0;
//理解: 若数组是1 2 3 4 5 则结果为6
// 1 3 3 3 5 转化成 1 2 3 3 4 结果为5
// 1 3 3 3 5
for(int i=0; i<n; i++)
if(a[i]>res) //res 不可能大于a[i] 这里排除的是等于a[i]的情况
//这种情况下 a[i]不可能转化成比前面数字更小 所以res不需要加
{
//printf("a[%d]=%d\n",i,res);
res++;
}
res++;//找到了转化后数组的最后一个元素的值 后按照题目要求需要在它的基础上再加一
printf("%d\n",res);
}
总结:该题的主要难点是理解题目的意思,感觉如果彻底弄清楚解题步骤的话,写出代码不是问题。分析需要仔细谨慎,考虑全面。现阶段还是水平太菜,见识太浅,唯有努力刷题刷题再刷题。另外英文水平和赛场心理素质都急需增强。敲代码完整理解好题目后再下手,切忌冒进烦躁。