A 瑞神的序列
题目描述
一个序列,这个序列长度为n,也就是一共有n个数,数列有几段? 段的定义是连续的相同的最长整数序列
思路
令tmp为当前段的元素,若相同则直接继续寻找,不相同的话则更新tmp,ans++
#include <stdio.h>
using namespace std;
int a[2000];
int n,len;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int tmp=a[0];
int ans=1;
for(int i=0;i<n;i++){
if(a[i]==tmp) len++;
else{
tmp=a[i];
ans++;
len=0;
}
}
printf("%d",ans);
return 0;
}
B 消消乐大师——Q老师
题目描述
游戏在一个包含有n行m列的棋盘上进行,棋盘的每个格子都有一种颜色的棋子。当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。当有多处可以被消除时,这些地方的棋子将同时被消除。
一个棋子可能在某一行和某一列同时被消除。
思路
用一个新的矩阵来存储该格子的状态,如果当前元素向后数三个或者向下数三个都相同的话,则在新矩阵中置为1。全部遍历完成后,将新矩阵中为1的点数字置为0即可,然后输出。
#include <stdio.h>
using namespace std;
int n,m;
int a[35][35];
bool b[35][35];
int main(){
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&a[i][j]);
for(int i=0;i<n;i++)
for(int j=0;j<m-2;j++){
if(a[i][j]==a[i][j+1]&&a[i][j+1]==a[i][j+2])
b[i][j]=b[i][j+1]=b[i][j+2]=1;
}
for(int j=0;j<m;j++)
for(int i=0;i<n-2;i++){
if(a[i][j]==a[i+1][j]&&a[i+1][j]==a[i+2][j])
b[i][j]=b[i+1][j]=b[i+2][j]=1;
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(b[i][j]==1)
a[i][j]=0;
if(j!=m-1) printf("%d ",a[i][j]);
else printf("%d",a[i][j]);
}
printf("\n");
}
return 0;
}
C 咕咕东学英语
题目描述
给定一个字符串,有多少个子串是delicious的?
Delicious定义:对于一个字符串,我们认为它是Delicious的当且仅当它的每一个字符都属于一个 大于1的回文子串中。
样例
5
AABBB
ans:6
分别为AA,BB,BB,AABB,BBB,AABBB
AAB不是因为B不在任何一个回文子串中
思路
对每一个元素向后进行寻找,记录A、B的个数和ABA…的个数,如果出现了ABA或者BAB那么无论后面是什么元素都将是delicious的,所以直接在ans上加上剩余元素的个数即可。如果出现AA或者BB的话就直接停止在ans上+1即可。遍历完毕后输出ans就是最终答案。
#include <stdio.h>
using namespace std;
int n;
char c[300010];
long long ans=0;
int main()
{
scanf("%d",&n);
scanf("%s",c);
for(int i=0; i<n-1; i++){
char now=c[i];
int sum=1; //ABAB…的个数
int numA=0,numB=0; //A或B的个数
if(c[i]=='A') numA++;
else numB++;
for(int j=i+1; j<n; j++)
{
if(c[j]!=now)
sum++,now=c[j];
if(c[j]=='A') numA++;
else numB++;
//判断是否满足
if(sum==1||(sum==2&&numA!=1&&numB!=1))
ans++;
else if(sum==3) //ABA或BAB后面的一定满足
{
ans=ans+n-j;
break;
}
}
}
printf("%d",ans);
return 0;
}