程序设计思维与实践 CSP-M3

T1 瑞神的序列

题目

瑞神的数学一向是最好的,连强大的咕咕东都要拜倒在瑞神的数学水平之下,虽然咕咕东很苦
恼,但是咕咕东拿瑞神一点办法都没有。
5.1期间大家都出去玩了,只有瑞神还在孜孜不倦的学习,瑞神想到了一个序列,这个序列长度为
,也就是一共有 个数,瑞神给自己出了一个问题:数列有几段?
段的定义是连续的相同的最长整数序列
输入描述
输入第一行一个整数n,表示数的个数
接下来一行n个空格隔开的整数,表示不同的数字
输出描述
输出一行,这个序列有多少段

思路

首先建立一个数组储存所有的数,然后使用sort函数将数组中的数从小到大排序。然后遍历数组,当前后两个数的大小不相等时即表示数据分了新的一段。所以使用计数器变量cnt并初始化为1,在遍历数组时一遇到前后数值不相等就将cnt加1,遍历完数组后的cnt值就是序列的段数

代码

#include<iostream>
using namespace std;
int main()
{
	int a[2000],n,cnt=1;
	cin>>n;
	for(int i=0;i<n;i++)
	 cin>>a[i];
	for(int i=1;i<n;i++)
	 if(a[i]!=a[i-1])
	  cnt++;
	cout<<cnt<<endl;
	return 0;
} 

T2 消消乐大师——Q老师

题目

Q老师是个很老实的老师,最近在积极准备考研。Q老师平时只喜欢用Linux系统,所以Q老师的电
脑上没什么娱乐的游戏,所以Q老师平时除了玩Linux上的赛车游戏SuperTuxKart之外,就是喜欢
消消乐了。
游戏在一个包含有n 行m 列的棋盘上进行,棋盘的每个格子都有一种颜色的棋子。当一行或一列
上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。当有多处可以被消除时,这些地
方的棋子将同时被消除。
一个棋子可能在某一行和某一列同时被消除。
由于这个游戏是闯关制,而且有时间限制,当Q老师打开下一关时,Q老师的好哥们叫Q老师去爬
泰山去了,Q老师不想输在这一关,所以它来求助你了!!
输入描述
输入第一行包含两个整数n,m,表示行数和列数
接下来n行m列,每行中数字用空格隔开,每个数字代表这个位置的棋子的颜色。数字都大于0.
输出描述
输出n行m列,每行中数字用空格隔开,输出消除之后的棋盘。(如果一个方格中的棋子被消除,
则对应的方格输出0,否则输出棋子的颜色编号。)

思路

使用二维数组来储存棋盘中的数组。
由于在单一二维数组中对数字进行操作可能会影响之后对数组中数字状态的判断而导致错误异常,所以需要使用两个二维数组,一个用于储存原始的棋盘数据并从中读取状态和需要的操作,另一个初始化为原始棋盘一模一样的二维数组,但需要做的变动都只在第二个二维数组中进行。
双重循环遍历原始二维数组中的数据,需要分两次遍历来分别检查横向和纵向需要做出的改动,当相邻三个数字相同时提取他们的二维索引,然后再第二个数组中将它们消除为0,最终输出第二个二维数组中的数据为正确结果。

代码

#include<iostream>
using namespace std;
int a[35][35],b[35][35];
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=0;i<n;i++)
	 for(int j=0;j<m;j++)
	 {
	 	cin>>a[i][j];
	 	b[i][j]=a[i][j];
	 }
	if(n>=3)
	{
		for(int j=0;j<m;j++)
		 for(int i=2;i<n;i++)
		 {
		 	if(a[i][j]==a[i-1][j]&&a[i-1][j]==a[i-2][j])
		 	{
		 		b[i][j]=0;
		 		b[i-1][j]=0;
		 		b[i-2][j]=0;
			}
		 }
	}
	if(m>=3)
	{
		for(int i=0;i<n;i++)
	     for(int j=2;j<m;j++)
	     {
	 	    if(a[i][j]==a[i][j-1]&&a[i][j-1]==a[i][j-2])
	 	    {
	 	    	b[i][j]=0;
	 	    	b[i][j-1]=0;
	 	    	b[i][j-2]=0;
			}
	     }
	}
	for(int i=0;i<n;i++)
	{
	    for(int j=0;j<m;j++)
	    {
	    	if(j==m-1)
	    	 cout<<b[i][j];
	    	else
	    	 cout<<b[i][j]<<" ";
		}
	    cout<<endl;
	}
	return 0;
	 
} 

T4 咕咕东学英语

题目

咕咕东很聪明,但他最近不幸被来自宇宙的宇宙射线击中,遭到了降智打击,他的英语水平被归
零了!这一切的始作俑者宇宙狗却毫不知情!
此时咕咕东碰到了一个好心人——TT,TT在吸猫之余教咕咕东学英语。今天TT打算教咕咕东字母A
和字母B,TT给了咕咕东一个只有大写A、B组成的序列,让咕咕东分辨这些字母。
但是咕咕东的其他学科水平都还在,敏锐的咕咕东想出一个问题考考TT:咕咕东问TT这个字符串
有多少个子串是Delicious的。
TT虽然会做这个问题,但是他吸完猫发现辉夜大小姐更新了,不想回答这个问题,并抛给了你,
你能帮他解决这个问题吗?
Delicious定义:对于一个字符串,我们认为它是Delicious的当且仅当它的每一个字符都属于一个
大于1的回文子串中。
输入描述
输入第一行一个正整数n,表示字符串长度
接下来一行,一个长度为n只由大写字母A、B构成的字符串。
输出描述
输出仅一行,表示符合题目要求的子串的个数。

思路

没有补题,就是原来的骗了60分的代码
错的思路也不知道咋写,想的是从原始字符串中截取所有长度的连续的字符串,然后在这些字符串里找符合要求的回文子串,写的是如果字符串中所有回文子串的位置最前为字符串的第一个,最后为字符串的最后一个的话就判定为所有字符都是回文子串,但是有bug比如aabcaa就会被判定为delicious。
后来讲的方法是,枚举出所有4种不合法的字符串,识别出连续的一段判定左右字符,匹配后记录数量之后再相减就行了

代码

#include<iostream>
#include<string.h>
using namespace std;
bool judge(string a)
{
	int n=a.length();
	int maxbegin,begin,i,j,Max=-1,Min=100;
	for(int len=2;len<=n;len++)
    {
        maxbegin=n-len;
        for(begin=0;begin<=maxbegin;begin++)
        {
            j=begin+len-1;
            for(i=begin;i<j;i++,j--) 
            {
                if(a[i]!=a[j]) 
				 break;
            }
            if(i>=j)
            {
                j=begin+len-1;
                Max=max(j,Max);
                Min=min(begin,Min);
            }
        }
    } 
    if(Max==n-1&&Min==0)
     return true;
    else
     return false;
}
int main()
{
	int len;
	cin>>len;
	string s;
	cin>>s;
	int cnt=0;
    for(int i=2;i<=len;i++)
    {
    	for(int j=0;j<=len-i;j++)
    	{
    		if(judge(s.substr(j,i)))
    		 cnt++;
		}
	}
	cout<<cnt<<endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值