第一次补题
J 签到 IGHE初级 FDB中等 AC中等偏难(初级对我来说就不简单了QAQ)
002比赛绝大部分题都没有思路,慢慢提升自己吧!
顺序比较混乱,是按照补题顺序来的。
先解决简单的题!
同学的题解连接
G - 0011
原题链接 G - 0011
之前做的时候没有想明白。看了同学发的题解顿悟了。悉心观察可以发现符合题意出现的01组合并不都是对称的出现的。之前做的时候出现了这种错误认知。
我们可以设置一个计数器n=0;将输入的数组从头到尾扫一遍,碰到0计数器n++,碰到1计数器n–;
另外,1.若在过程中出现n<0的情况,则说明出现了1在与其对应的0前面的情况,不符合题意;
若在情况1未发生的情况下出现了最终结果n>0,则说明出现了多余的0的情况,不符合题意;
最终的情况可以总结为只有过程中不出现n<0且最终n=0则输出YES;else cout<<no;
同时是第一次尝试C++
补题的时候出现了Compilation error 原因:提交代码的时候以C形式提交。
#include<cstdio>
#include<string.h>
using namespace std;
int main()
{
int len,n=0;
int i,m;
char s[1100];
cin>>m;
while(m--)
{
n=0;
cin>>s;
len=strlen(s);
for(i=0;i<len;i++)
{
if(s[i]=='0')
n++;
else if(s[i]=='1')
n--;
if(n<0)
break;
}
if(n==0)
cout<<"YES\n";
else
cout<<"NO\n";
}
return 0;
}
H.Perfect String
题意 :给一个仅由a,b,c,?构成的字符串,要求把所有问号变成a/b/c,使任意相邻的两个字符不相同。
我的理解:两个字符不可以相同,同时间杂"?“出现。要求”?"变成与左右两个字符不相同的字符(仅限于a\b\c);
原题链接 H.Perfect String
#include<iostream>
#include<string.h>
#include<cstdio>
using namespace std;
int main()
{
string s;// 定义一个字符串s
int f,t,i;
cin>>t;//输入数据组数
while(t--)
{
cin>>s;//输入字符串内容
f=1;//f来判断输出结果
if(s[0]=='?')//判断特殊情况,
{
if(s[1]!='a')
s[0]='a';
else if(s[1]!='b')
s[0]='b';
else if(s[1]!='c')
s[0]='c';
}
for(i=0;i<s.length();i++)// s.length() s字符串的长度
{
if(s[i]=='?')
{
if(s[i+1]!='a'&&s[i-1]!='a')
s[i]='a';
else if(s[i+1]!='b'&&s[i-1]!='b')
s[i]='b';
else if(s[i+1]!='c'&&s[i-1]!='c')
s[i]='c';
}
else
{
if(s[i]==s[i+1])
{
f=0;break;
}
}
if(f)cout<<s<<endl;
else
cout<<"-1\n";
}
}
return 0;
}
c写法
#include<stdio.h>
int main()
{
char s[100000];//注意数组必须开这么大。 之前开了一个s[100]超时错误了
int f,t,i,x;
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
f=1;
if(s[0]=='?')
{
if(s[1]!='a')
s[0]='a';
else if(s[1]!='b')
s[0]='b';
else if(s[1]!='c')
s[0]='c';
}
x=strlen(s);
for(i=0;i<x;i++)
{
if(s[i]=='?')
{
if(s[i+1]!='a'&&s[i-1]!='a')
s[i]='a';
else if(s[i+1]!='b'&&s[i-1]!='b')
s[i]='b';
else if(s[i+1]!='c'&&s[i-1]!='c')
s[i]='c';
}
else
if(s[i]==s[i+1])
{
f=0;break;
}
}
if(f)printf("%s\n",s);
else
printf("-1\n");
}
return 0;
}
I.十进制中的二进制
I用到了DFS,刚好复习一下