A瑞神的序列
思路:
这道题很简单,直接判断上一个和下一个是否相等就行了,若不等结果加一,一直到最后输出结果
#include<iostream>
using namespace std;
long long int n1=1,n;
int A[100000];
int main()
{
cin>>n;
int a;
cin>>A[0];
a=A[0];
for(int i=1;i<n;i++)
{
cin>>A[i];
if(a!=A[i])n1++;
a=A[i];
}
cout<<n1;
return 0;
}
B消消乐大师
思路:
这道题和我们平时玩的消消乐很像,就是横着或者竖着的连续三个以上会消去变成0,但是当检测到横着或者竖着的有三个0的时候不能直接修改,因为其他地方了能还要用得到,所以在另开数组开存储是否要消去。
#include<iostream>
using namespace std;
int A[40][40],n,m,B[40][40];
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int k=0;k<m;k++)
{
cin>>A[i][k];
B[i][k]=0;
}
}
for(int i=0;i<n;i++)
{
for(int k=0;k<m;k++)
{
if(i<n-2)
{
if((A[i][k]!=0)&&(A[i][k]==A[i+1][k]&&A[i+1][k]==A[i+2][k]))
{
int i1=i+3;
while(A[i][k]==A[i1][k]&&i1<n)
{
B[i1][k]=1;
i1++;
}
B[i][k]=B[i+1][k]=B[i+2][k]=1;
}
}
if(k<m-2)
{
if((A[i][k]!=0)&&(A[i][k]==A[i][k+1]&&A[i][k+1]==A[i][k+2]))
{
int k1=k+3;
while(A[i][k]==A[i][k1]&&k1<m)
{
B[i][k1]=1;
k1++;
}
B[i][k]=B[i][k+1]=B[i][k+2]=1;
}
}
}
}
for(int i=0;i<n;i++)
{
for(int k=0;k<m;k++)
{
if(!B[i][k])
{
if(k<m-1)cout<<A[i][k]<<" ";
else cout<<A[i][k];
}
else
{
if(k<m-1)cout<<"0"<<" ";
else cout<<"0";
}
}
if(i<n-1)cout<<endl;
}
return 0;
}
C:咕咕东学英语
思路:
这道题要是按照正常写的话会很难,所以转换一下思想,找到不是decilious的就可以解出这道题了。
先是顺序的遍历数组,若是有AB,数组-1,下一个若还是B,-1,这样就可是去除所有的形如ABBBB这样的不是decilious的子串。
然后在倒序遍历数组这样筛选出所有的BBBBA 的情况。
#include<iostream>
using namespace std;
long long int n,re=0,total=0,vis=0;
char A[1000000],B[1000000];
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>A[i];
}
total=n*(n-1)/2;
// cout<<total<<endl;
for(int i=1;i<n;i++)
{
if(A[i]!=A[i-1])
{
total++;
total=total-i+vis;
vis=i;
}
}
// cout<<total<<endl;
vis=0;
int ff=0;
for(int i=n-1;i>=0;i--)
{
B[ff++]=A[i];
}
for(int i=1;i<n;i++)
{
if(B[i]!=B[i-1])
{
total=total-i+vis;
vis=i;
}
}
cout<<total;
return 0;
}