通师高专科技创新社训练赛(20221130)

A-[NOIP2018]标题统计

题目链接

题意

输入一行数,统计其中共有多少个字符,用一个整数表示字符数(不包括空格和换行符)

思路

总长度减去空格和换行的字符数

坑点

空格容易忘记减去

实现步骤

1.先用for循环统计该标题的总长度;
2.如果有空格和换行,,则需要除去其占用的字符;
3.最后用自增的方式求出字符的数量。

代码

#include<stdio.h>
#include<iostream>
using namespace std; 
int main()
{
	string s;//生成一个字符串s
	int sum=0;
	getline(cin,s);//读取字符串
	for(int i=0;i<s.length();i++)//用循环表示s的长度
	{
		if(s[i]!=' '&&s[i]!='\n')//排除空格和换行
		{
			sum++;//累加
		}
	}
	cout<<sum;
	return 0;
}

总结

注意题中括号中的内容。

B - 数字统计

题目链接

题意

 统计给定范围[L, R]中,数字2出现的次数

思路

分个位,十位,百位...,当等于2时累加

坑点

1.要给i赋值,防止被修改

算法

1.定义三个变量L,R,sum
2.给sum赋值0
3.%10抹除个位
4.当i等于2时,sum累加
5.输出sum

实现步骤

1.先用for循环,再用while循环
2.用%10分离每一位,看看是否是2
3.等于2时累加

代码

#include<stdio.h>
#include<iostream> 
using namespace std;
int main( )
{
	int L,R,sum=0;
	cin>>L>>R;
	int c=L;
	int a[10005];
	for(int i=L;i<=R;i++)
	{
		a[i]=i;
		int c=i;//防止i被修改
		while(c!=0)
		{
			if(c%10==2)//c取余等于2时,累加
			{
				sum++;
			}
			c/=10;//相当于c=c/10,抹除个位
		 } 
	}
    cout<<sum;//输出2的个数
	return 0;
}

总结

 关于for循环while循环的使用,用到取余和复合赋值运算符.

 C - 字符串分类

题目链接

题意

统计n个字符串中有几种本质上不同的字符串

思路

用for循环输入,判断两个字符串是否一样

坑点

ab!=ba

实现步骤

1.输出n个字符串;
2.用两层for循环进行字符串之间的比较,判断其是否一样;
3.字符串一样用break阻止;
4.如果字符串不一样,则进行累加。

代码

#include<stdio.h>
#include<string.h>
#include<iostream>

using namespace std;
int main()
{
    int n,k=1;
    cin>>n;
    string s[n];
    for(int i=0;i<n;i++)
    {
    	cin>>s[i];//输入一组字符串s[i]
	}
	for(int i=0;i<n-1;i++)
	{
		int f=1;
		for(int j=i+1;j<n;j++)
		{
			if(s[i]==s[j])
			{
				f=0;
				break;//字符串相同,则停止输出
			}
		}
		if(f==1)
		{
		    k++;//字符串不同进行累加
	    }
	 } 
	 cout<<k;
	 return 0;
}

总结

先用双重循环打印出字符串,再对字符串中的 字符进行比较判断。

D - 李在赣神魔

题目链接

题意

输入一个n×n的字符矩阵,将其顺时针旋转90度后输出。

思路

1.用二维数组输入一个n×n的字符矩阵
2.按顺时针旋转九十度之后呈现一个倒序

坑点

 1.顺时针旋转九十度

算法

 1.定义一个变量n,
 2.定义一个字符型的二维数组
 3.改变for循环内容输出答案

实现步骤

 1.先输入一个二维数组
 2.用for循环

代码 

#include<iostream>
using namespace std;
int main( )
{
	int n,i,j;
	cin>>n;
	char a[1005][1005];
	for(i=1;i<=n;i++)//用二维数组输入一个n×n的字符矩阵
	{
		for(j=1;j<=n;j++)
		{
		cin>>a[i][j];
	    }
	}
	for(i=1;i<=n;i++)
	{
		for(j=n;j>=1;j--)//顺时针旋转之后呈现一个倒序
		{
			cout<<a[j][i];//旋转之前的i和旋转之后的j相等
		}
		cout<<endl;
	}

	return 0;
}

总结

考察二维数组的运用  注意打草稿

E - 火车上的2连座 

题目链接

题意

A,B两人选择两个二连坐坐下

思路

1.A,B两人一起坐火车,从第一排开始,依次向后判断,如果有两个连座就坐下;
2.如果过道两边都可以座,优先选择左边;
3.有输出YES,没有输出NO。

坑点

必须是过道一侧的两个连座

实现步骤

1.用while输出n排座;
2.用两层for循环对每个座位是否空着进行判断;

代码

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
	int n;
	while(cin>>n)
	{
		string a[10000];//输出一组数
		int flag=0;
		for(int i=0;i<n;i++)
		{
			cin>>a[i];
		}
		for(int i=0;i<n;i++)
		{
			if(a[i][0]=='O'&&a[i][1]=='O')
			{
				a[i][0]='+';
				a[i][1]='+';
				flag=1;
				break;
		      }
			else if(a[i][3]=='O'&&a[i][4]=='O')
			{
				a[i][3]='+';
				a[i][4]='+';
				flag=1;
				break;//从第一个座位开始判断两个连续的座位是否可以座,如果有座就停止循环
			}
		}
		if(flag=1)
		{
			cout<<"YES"<<endl;
			for(int i=0;i<n;i++)
			{
				cout<<a[i]<<endl;
			}//如果有座,输出“YES”
		}
		else
		{
			cout<<"NO"<<endl;
		}//否则输出“NO”
	}
	return 0;
 } 

总结

将每两个座位作为一组进行判断进行一一判断

F - 字符串操作 

题目链接

题意

给定长度为n的字符串s,进行m次操作,每次将[l,r]范围内所有c1字符改成c2

思路

1.双重for循环
2.在l到r的范围内将c1更改为c2

坑点

1.r一定小于n

算法

 1.定义两个变量n,m
 2.定义一个字符串a
 3.用for循环找到需要更改的位置
 4.输出更改完成后的答案

实现步骤

1.用双重for循环
2.在l到r的范围内将c1更改为c2

代码

#include<iostream>
using namespace std;
int main( )
{
	int n,m;
	string a;
	cin>>n>>m;//输入长度n,操作次数m
	cin>>a;
	for(int i=0;i<m;i++)
	{
		int l,r;//区间
		cin>>l>>r;
		char c1,c2; //将c1更改为c2
		cin>>c1>>c2;
		for(int j=l-1;j<r;j++)
		{
			if(a[j]==c1)
			{
				a[j]=c2;//找到后更改
			}
		}
	}
	cout<<a;//输出更改后的
	return 0;
}

总结

考察字符替换方法,用到二重循环

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值