//---------------------------以下是主题部分-------------------------------------- 本题因为最后一定会清空一个队列的人数,所以c中有一个元素为0,那么想要使MEX尽可能大就需要有某个队列最后增加的人数为1,那么我们在倒数第二时间清空它即可在最后得到一个人数为一的队列,MEX就被增大,如果最后没有人数为一的队列,那么MEX就会为一。同理,想要MEX达到最大值,我们需要找到后缀1的和为1,2,3······的队列,直到没有满足条件的后缀和。 注意:
- 由于我们可以选择某一时刻对队列进行清空,所以后缀和大的队列可以截断替代后缀和小的队列。
- 需要特判一下所有队列后缀和都满足条件的情况,因为一定会有队列最后被清空,所以我们人为选择把后缀和最大的队列清空,就能得到MEX的最大值为n。
- 因为多组数据,记得清空数组和下标。 //-------------------------以下是代码部分-----------------------------------------
#include <algorithm>
using namespace std;
int n;
int a[305];
int hz[305];//用来存1的后缀和
int tot=0;//hz的下标
void hzsum(){
int p=1;
while(a[n-p+1]==1){
p++;
}
hz[++tot]=p-1;
}
int main(){
int t;
cin>>t;
while(t--){
cin>>n;
for(int j=1;j<=n;j++){
for(int i=1;i<=n;i++){
cin>>a[i];
}
hzsum();
}
sort(hz+1,hz+1+n);
// for(int i=1;i<=n;i++){
// cout<<hz[i]<<"-->";
// }
// cout<<endl;
int tot1=0;
int now=0;
for(int i=1;i<=n;i++){
if(hz[i]>now){
tot1++;
now++;
}
}
if(tot1==n) cout<<tot1<<endl;
else cout<<tot1+1<<endl;
for(int i=1;i<=n;i++){
hz[i]=0;
}
tot=0;
}
return 0;
}
//---------------------以下是反思部分----------------------------------
- 赛时没读懂题目每一行代表一个队列。
- 没有想到使MEX尽可能大的条件是队列后缀1的和依次递增(算截断)。