这里就讲一下前面三道题的做法,因为今天只不到了前面三题,有时候觉得自己的效率好难绷,不过放假了,还是要以休息为主。
首先是第一道题,比赛刚开始,看到这道题感觉有一点懵,它先是说有两个good的数列,这两个数列,有一个条件说满足这两个条件他才可以被称为good,但是在后面,题目又说要将这些数字给重新组合,使得新数组里面至少有三种数字,那么这个条件是什么呢?首先假设数组a,b长度为1,这自然是不行的,若是两个数组长度为2,但是a里面只有1种数字,而b里面只有1种数字,那么这时,新的组合里面最多只会有1种数字;如果a里面有2种数字,b里面有1种数字,那么组合出来也只有2种数字;如果a里面有2种数字,而b里面有2种数字,那么就可以组合出2种数字或者1种数字;但是若是a里面有3种数字,而b里面有1种数字,那么就可以组合出新数组里面有3种数字;所以我们只需要统计a数组和b数组里面有多少种数字就可以了,至于是不是Good不重要。
下面是AC 代码
#include<bits/stdc++.h>
using namespace std;void sol(){int n;scanf("%d",&n);set<int> a,b;for(int i=0;i<n;i++){int a1;scanf("%d",&a1);a.insert(a1);}for(int i=0;i<n;i++){int b1;scanf("%d",&b1);b.insert(b1);}int num1=a.size();int num2=b.size();if(num1+num2<=3){cout<<"No"<<endl;}else{cout<<"Yes"<<endl;}
}int main(){int T;scanf("%d",&T);while(T--){sol();}return 0;
}
在接下来的B题,B题当时做了好久,没有做出来,比赛就结束了。
于是打开了tutorial,这道题的思路是要分两种情况去讨论,首先是第一种情况n=k,这里直接暴力模拟就可以得到答案,而对于n!=k的情况,则是去观察第二段的起始位置,若是第二段的起始位置不是1,那么直接就输出答案是1,但是若是第二段的起始位置是1,那么就去往后面看下一个1出现在什么地方。如果第二个数组在接下来的情况下又出现了1,那么此时这里的答案就是2,所以说在这里只有1和2两种情况。
下面是AC代码。
#include<bits/stdc++.h>
using namespace std;void sol(){int n,k;scanf("%d %d",&n,&k);vector<int> a;for(int i=0;i<n;i++){int num;scanf("%d",&num);a.push_back(num);}if(k==n){for(int i=1;i<n;i+=2){if(a[i]!=((i+1)/2)){cout<<(i+1)/2<<endl;return;}}cout<<k/2+1<<endl;}else{for(int i=1;i<n-k+2;i++){if(a[i]!=1){cout<<1<<endl;return;}}cout<<2<<endl;}
}
int main(){int T;scanf("%d",&T);while(T--){sol();}return 0;
}
接下来C题,他的思路是这样子的,若是要让MEX最大,我们就要是最后的数组尽可能是[0,1,2,......]这样子的,而对于清空操作,其实意味着每一行剩下的是他某位置的后缀和,而每一次由于只可以清空一个行,所以意味着每行索取的后缀和是不同的,在这里0一定会出现,因为最后一次清楚就会产生0。那么如果清空后出现1,又是什么情况因为题目说了a[i][j]>=1。所以在这里出现1只能是在第n为出现1.那么对于n-1,n-2,n-3这些位置,怎么才可以出现2的后缀和,由于n位置出现1才可以为1,所以出现2的后缀和只可以是在n-1的位置出现1才可以,以此类推,n-1,n-2,n-3分别都是1才有可能出现(1位置为数组起点)。那么在这里我只要去统计一下每一行出现1的数量,这个作为xi加入到数组里面,然后判断第一个没有出现的数字就可以了。
下面是AC的代码。
#include <bits/stdc++.h>
using namespace std;const int N=305;int a[N][N],suff[N];void solve(){int n;cin>>n;for(int i=1;i<=n;i++){suff[i]=0;for(int j=1;j<=n;j++){cin>>a[i][j];}}for(int i=1;i<=n;i++){for(int j=n;j>=1;j--){if(a[i][j]!=1){break;}suff[i]++;}}set<int> suff2;for(int i=1;i<=n;i++){suff2.insert(suff[i]);}vector<int> suff3;for(auto it=suff2.begin();it!=suff2.end();it++){suff3.push_back(*it);}for(int i=0;i<=suff3.size();i++){if(suff3[i]!=i){cout<<i<<endl;break;}}
}int main(){ios_base::sync_with_stdio(0);cin.tie(0);int t;cin>>t;while(t--){solve();}return 0;
}