2011: Mex Query
題目描述:
Give nn non-negative integers, please find the least non-negative integer that doesn’t occur in the nn numbers.
輸入:
The first line is an integer TT, representing the number of test cases.
For each test case:
The first line of each test case is an integer nn.
The second line of each test case are nn non-negative integers a\_iai.
T \leq 10T≤10
n \leq 2 \times 10^5n≤2×105
0 \leq a\_i < 2^{31}0≤ai<231
輸出:
or each test case, output a line with the answer.
2
4
4 0 1 3
2
1 1
2
0
該題是河北省第二屆省賽第二題的加強版,樣例比省賽原題多了一個,原題只有一個測試用例,當時做原題的時候那個樣例爲4\n 4 0 1 1,我當時理解出了問題least理解成了區間中最少沒有出現的個數,正好樣例區分不出來,就進了區間坑裏,後來反應出來是最少的時候,腦子裏已經沒有上限的概念了。。如輸入3\n 0 1 2時不知道該輸出什麼了。當時因爲在區間中深陷,知道兩個端點值,所以沒有用到排序,直接用的標記法。比賽肯定是要設置一些陷阱的吧
重現賽做的時候用排序法第一次提交時是66.66%,在測試一些數據後發現該算法在不去重的情況下顯示的結果不正確,從而有引入了一個最大數據邊界的標記數組進行輔助優化,然後就可以通過了。理解正確題意真的很重要,否則無論怎樣修改提交答案總是錯誤的。這也讓我反思了我的慣性思維,因爲以前做過一道類似的題就沒有弄清楚題意,有時候腦海中認爲是正確的東西容易根深蒂固,其實可能一開始就是錯誤的。
#include<bits/stdc++.h>
using namespace std;
int a[200001];
int main()
{
int T,n,k,i,N;
int flag;
cin>>T;
while(T--) //第一次通過了66.66%,處理上界情況的時候n-1寫成了i-1
{
N=0;
cin>>n; //0 1 1 4 2 5有重複數字的時候沒有解決 0 4 1 1 2
int F[n];
memset(F,-1,sizeof(F));
memset(a,-1,sizeof(a));
flag=0;
for(i=0;i<n;i++)
{
cin>>k;
F[i]=k;
}
sort(F,F+n);
//去重
a[N++]=F[0];
for(i=1;i<n;i++)
{
if(F[i]!=F[i-1])
{
a[N++]=F[i];
}
}
for(i=0;i<N;i++)
{
if(a[i]!=i)
{
printf("%d\n",i);
flag=1;
break;
}
}
if(flag==0)
printf("%d\n",a[N-1]+1);
}
}
結果 | 耗時 | 內存 |
---|---|---|
通過 | 0 | 3993600 |
通過 | 0 | 4059136 |
通過 | 0 | 4927488 |
而且memset()與sort結合的方法並沒有超時
不能因爲一次次的失敗挫折就失去信心,如果自己都認爲自己輸了,那麼自己纔是真的輸掉了