SDU程序设计第三次csp模拟

A瑞神的序列

题目

题目
input&&output
input&&output
Sample

#input:
12
2 3 3 6 6 6 1 1 4 5 1 4
#output:
8

题解

读入的时候只要观察什么时候改变就好了(记录上一个数)
改变时计数加一

C++代码

#include<iostream>
#include<vector>
using namespace std;

vector<int> v(0);
int n,c;
int main(){
	cin>>n;
	cin>>c;
	v.push_back(c);
	for(int i=1;i<n;i++){
		cin>>c;
		if(c!=v[v.size()-1]) v.push_back(c);
	}
	cout<<v.size()<<endl;
	return 0;
}

B消消乐大师——Q老师

题目

题目
input&&output
input&&output
Sample

#input1:
4 5 
2 2 3 1 2 
3 4 5 1 4 
2 3 2 1 3 
2 2 2 4 4

#output1:
2 2 3 0 2 
3 4 5 0 4 
2 3 2 0 3 
0 0 0 4 4

#input2:
4 5 
2 2 3 1 2 
3 1 1 1 1 
2 3 2 1 3 
2 2 3 3 3

#output2:
2 2 3 0 2 
3 0 0 0 0 
2 3 2 0 3 
2 2 0 0 0

题解

能消去的一定满足如下三连的某种情况情况
    x
    x
x x x x x
    x
    x
因此我们对于  i,j  只要 关注 ( i,j | i,j+1 | i,j+2)  ( i,j | i,j+1 | i,j-1)  ( i,j | i,j-1 | i,j-2)  ( i,j | i-1,j | i-2,j)  ( i,j | i-1,j | i+1,j)   ( i,j | i+1,j | i+2,j)这六种情况是否有一种三项相同,由于会出现四个一样的因此 此处利用一个矩阵记录原矩阵根据原矩阵填结果矩阵

C++代码

#include<iostream>

using namespace std;
const int maxn = 35;
int m,n;//n行m列 
int ele[maxn][maxn],ret[maxn][maxn];

int main(){
	cin>>n>>m;
	for(int i=0;i<=1+n;i++)
		for(int j=0;j<=1+m;j++){//左右边界扩大防溢出 
			ele[i][j]=0;
			ret[i][j]=0;
		}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>ele[i][j];
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(j!=1) cout<<" ";
			if((ele[i][j] == ele[i+1][j] && ele[i][j] == ele[i-1][j]) || (ele[i][j] == ele[i][j+1] && ele[i][j] == ele[i][j-1]) || 
				(ele[i][j] == ele[i+2][j] && ele[i][j] == ele[i+1][j]) || (ele[i][j] == ele[i][j-1] && ele[i][j] == ele[i][j-2]) ||
				(ele[i][j] == ele[i-2][j] && ele[i][j] == ele[i-1][j]) || (ele[i][j] == ele[i][j+1] && ele[i][j] == ele[i][j+2]))
				cout<<0;
			else cout<<ele[i][j];
		}
		if(i!=n)cout<<endl;
	} 
	return 0;
}

C咕咕东学英语

题目

题目
input&&output
input&&output
Sample

#input:
5 
AABBB
#output:
6

题解

本题如果暴力判断每个 子串显然会超时
因此我们有两种想法
1.寻找所有满足的类型 也就是含 AABB  AB(n)A  BA(n)B 或仅含 AA  或 BB的子串
2.寻找不满足的类型 然后用总子串个数减去 不满足类型  AB(n)  或 BA(n)
对于1来说类型过多不便于判断  且数量较多 不便于计算(可能也会超时
对于2来说就简单了许多,我们会发现这两种情况只会出现在有交界处的地方
如: AABBB  只会出现在 2、3位置  因此不存在的有  AB ABB ABBB AAB(右向左看就是 BAA BA重复了)
通过刚刚那个例子大概就表达了我的计算方法
首先计算字符串的段数
两次遍历:
	第一次 正向遍历 从第二段开始  不存在的个数 即为每段段长
	第二次 逆向遍历 从导数第二段开始  不存在的即为 每段断肠减1(因为正向时 AB(或BA)计算过)

C++代码

#include<iostream>
#include<vector>
using namespace std;
string str;
vector<long long> v(0);
int main(){
	long long n;
	cin>>n>>str;
	long long cnt = 0,num=1;
	for(int i=1;i<n;i++){
		if(str[i] == str[i-1]){
			num++;
		}else{
			v.push_back(num);
			num=1;
		}
	}
	v.push_back(num);
	for(int i=1;i<v.size();i++) cnt-=v[i];
	for(int i=v.size()-2;i>=0;i--) cnt-=v[i]-1;//不满足个数
	for(int i=1;i<n;i++) cnt+=i; 
	cout<<cnt<<endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值