本文主要是介绍SDU程序设计第三次csp模拟,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
SDU程序设计第三次csp模拟
- A瑞神的序列
- 题目
- 题解
- C++代码
- B消消乐大师——Q老师
- 题目
- 题解
- C++代码
- C咕咕东学英语
- 题目
- 题解
- C++代码
A瑞神的序列
题目
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
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
题解
能消去的一定满足如下三连的某种情况情况
xx
x x x x xxx
因此我们对于 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
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;
}
这篇关于SDU程序设计第三次csp模拟的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!