CODEFORCE 1002 DIV2讲解
这里就讲一下前面三道题的做法,因为今天只不到了前面三题,有时候觉得自己的效率好难绷,不过放假了,还是要以休息为主。
首先是第一道题,比赛刚开始,看到这道题感觉有一点懵,它先是说有两个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;
}
本文作者:芙芙芙啊
本文链接:https://www.cnblogs.com/fufufuf/p/18698334
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步