【作业向】程序设计思维与实践 CSP-M3

【作业向】程序设计思维与实践 CSP-M3

A 瑞神的序列

一个比较简单的模拟题,读入一个数的时候将其与上一个数比较,若不同则段数加1,最后输出总段数即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<utility>
#include<map>
#define ll long long
using namespace std;
int n,sum,pre=0x7fffffff;

int main()
{
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&j);
if(j!=pre)
{
sum++;
pre=j;
}
}
printf("%d",sum);
return 0;
}

B 消消乐大师——Q老师

一道模拟题,对于每个格子只向右或向下遍历,遇到不同的数值则停止,若走出的距离大于三则将经过的格子标记。最后输出的时候若格子已被标记则输出0,否则正常输出。

(又及:一定要遍历每一个格子!!!考试的时候怕TLE就写了个被标记的格子不再遍历,导致清况判断不全,才得了20分😭

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<utility>
#include<map>
#define ll long long
using namespace std;
int m,n;
int a[35][35],visit[35][35];

void dfs(int x,int y)
{
int i,j;
i=x+1;
while(a[i-1][y]==a[i][y] && i<=n) i++;
if(i-x>=3)
{
for(j=x;j<i;j++) visit[j][y]=1;
}
i=y+1;
while(a[x][i-1]==a[x][i] && i<=m) i++;
if(i-y>=3)
{
for(j=y;j<i;j++) visit[x][j]=1;
}
}

int main()
{
int i,j;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++) scanf("%d",&a[i][j]);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
dfs(i,j);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(visit[i][j]) printf("0");
else printf("%d",a[i][j]);
if(j!=m) printf(" ");
}
if(i!=n) printf("\n");
}
return 0;
}

C 咕咕东学英语

这一题乍一看是个字符串的题目,但由于只有AB两个字母这一题应该是一个数学问题。我们可以知道,不符合要求的字串形如:ABBBB…、BAAAA…、AAAAB…以及BBBBA…这四种。因此我们只需要求出总的字串的数量,然后减去不符合条件的字串的数量即可。

为了解决这个问题,我们对字符串进行统计,将相邻的相同的字母合并,得到一个数列。这个数列按顺序记录了各个字母连续出现的次数,然后我们将总的字串的数量减去 a[1]+a[cnt]+a[k]*2(2<=k<=cnt-1) 后得到的就是最终的答案。

(又及:改完bug一定要提交!!!!因为忘了提交少拿了10分,我需要好好清醒清醒

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<utility>
#include<map>
#define ll long long
using namespace std;
ll n,cnt,sum;
ll a[300005];
char c,p;

int main()
{
ll i,j;
scanf("%lld",&n);
sum=n*(n-1)/2;
for(i=1;i<=n;i++)
{
scanf(" %c",&c);
if(c==p) a[cnt]++;
else a[++cnt]=1;
p=c;
}
if(cnt>=2)
{
for(i=2;i<cnt;i++) sum-=a[i]*2;
sum-=(a[1]+a[cnt]);
sum+=cnt-1;
}
printf("%lld",sum);
return 0;
}
坚持原创技术分享,您的支持将鼓励我继续创作!