CSP-M3补题

A-瑞神的序列

B-消消乐大师——Q老师

C-咕咕东学英语

A-瑞神的序列

题目

在这里插入图片描述

思路

遍历数据,记录上一个数字,当前数字与上一个数字不相同则段数+1。

代码

#include <iostream>
using namespace std;

int main() {
	int a[100001],n;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	int temp=a[1],ans=1;
	for(int i=2;i<=n;i++) {
		if(a[i]!=a[i-1]) {
			ans++;
			temp=a[i];
		}
	}
	cout<<ans<<endl;
	return 0;
} 

B-消消乐大师——Q老师

题目

在这里插入图片描述

思路

使用数组clear[40][40]记录某个位置的数组是否要清0。从左上角开始,对每一个元素检查其是否与右边两个元素相等,和其是否与下边两个元素相等,若相等,则将clear数组中3个位置的元素标记。最后输出原矩阵,若矩阵某一元素所在位置的clear被标记,则输出0。

代码

#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;

int n,m;
int a[40][40],clear[40][40]; 
int main() {
	cin>>n>>m;
	for(int i=1;i<=n;i++){
	 	for(int j=1;j<=m;j++) {
	 		cin>>a[i][j];
		}
	}
	memset(clear,-1,sizeof clear);
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (a[i][j] == a[i + 1][j] && a[i][j] == a[i + 2][j]) {
				clear[i][j] = 1;
				clear[i + 1][j] = 1; 
				clear[i + 2][j] = 1;
			}
			if (a[i][j] == a[i][j+1] && a[i][j] == a[i][j + 2]) {
				clear[i][j] = 1;
				clear[i][j+1] = 1;
				clear[i][j+2] = 1;
			}
		}
	}

	for(int i=1;i<=n;i++){
	 	for(int j=1;j<=m;j++) {
	 		if(clear[i][j]==1) cout<<0;
	 		else cout<<a[i][j];
	 		if(j!=m) cout<<' ';
		}
		cout<<endl;
	}
	return 0;
}

C-咕咕东学英语

题目

在这里插入图片描述

思路

只有A和B两种字母,则形如ABA,BAB,ABBB…BA,BAAA…AB都是delicious的,形如AB,BA,ABBB…B,BAAA…A都不是delicious的。计算非delicious会比较方便。可通过正序遍历数组求BBB…A型非Delicious,倒序遍历数组求ABBB…B型非delicious。另外,两次遍历中,AB和BA型非Delicious会被重复计算一次,故最后需要减去AB和BA的出现次数。

代码

#include <iostream>
using namespace std;
int a[1000001];;
long long int sum,n,index=1,re=0;
int main() {
	char temp;
	cin>>n;
	sum=n*(n-1)/2;
	for(int i=1;i<=n;i++) {
		cin>>temp;
		if(temp=='A') a[i]=1;
		if(temp=='B') a[i]=0;
 	} 
 	
 	for(int i=1;i<=n-1;i++) {
 		if(a[i]!=a[i+1]) {
 			sum-=i-index+1;
 			index=i+1;
 			re++;
		 }
	}
	
	index=n;
	for(int i=n;i>=2;i--) {
		if(a[i]!=a[i-1]) {
			sum-=index-i+1;
			index=i-1;
		}
	}
	cout<<sum+re<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值