3级考题(c++)

文章介绍了C++编程中的几个示例,涉及字符串操作(如getline和strlen)、矩阵遍历与操作(如排序和计数)、算法应用(如寻找流感传播和糖果吃法)、以及波兰表达式的计算,展示了基础编程技术和逻辑运用。
摘要由CSDN通过智能技术生成

#include<bits/stdc++.h>
using namespace std;
int main()
{
	char a[100] = {'\0'};
	cin.getline(a,100);
	int lc = 0;
	int cnt[100] = {0};
    int n = strlen(a);
    char c[100][100] = {'\0'};
    for(int i = 0;i<n;i++)
    {
        for(int j = i;j<n;j++)
        {
            char b[100] = {'\0'};
            for(int k = i;k<=j;k++)
            {
                b[k-i] = a[k];
            }
            bool f = false;
            for(int k = 0;k<lc;k++)
            {
            	bool t = true;
            	for(int h = 0;h<100;h++)
            	{
            		if(c[k][h]!=b[h])
            		{
            			t = false;
            			break;
					}
				}
				if(t==true)
				{
					f = true;
					cnt[k]++;
					break;
				}
			}
			if(f==false)
			{
				for(int k = 0;k<100;k++)
				{
					c[lc][k] = b[k];
				}
				cnt[lc] = 1;
				lc++;
			}
		}
    }
    for(int i = 0;i<lc-1;i++)//排序
    {
    	for(int j = 0;j<lc-i-1;j++)
    	{
    		bool f = true;
    		for(int k = 0;k<100;k++)
    		{
    			if(c[j][k]>c[j+1][k])
    			{
    				f = false;
    				break;
				}
			}
			if(f==false)
			{
				char t[100] = {'\0'};
				for(int k = 0;k<100;k++)
				{
					t[k] = c[j][k];
					c[j][k] =c[j+1][k];
					c[j+1][k] = t[k];
				}
				int tt = cnt[j];
				cnt[j] = cnt[j+1];
				cnt[j+1] = tt;
			}
		}
	}
    for(int i = 0;i<lc;i++)
    {
    	if(cnt[i]>1)
    	{
    		int j = 0;
    		while(c[i][j]!='\0'&&c[i][j]!=' ')
    		{
    			cout<<c[i][j];
    			j++;
			}
			cout<<" "<<cnt[i]<<endl;
		}
	}
	return 0;
}

#6146. 流感传染

题目描述

有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。

在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。

请输出第m天得流感的人数。

输入格式

第一行一个数字n,n不超过100,表示有n*n的宿舍房间。

接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。

接下来的一行是一个整数m,m不超过100。

输出格式

输出第m天,得流感的人数。

样例

样例输入

复制5
....#
.#.@.
.#@..
#....
.....
4

样例输出

复制16
#include <bits/stdc++.h>
using namespace std;
int n;
int sum = 0;
char a[100][100];
void aaa(int,int);
int main()
{
	cin>>n;
	for(int i = 0;i<n;i++)
	{
		for(int j = 0;j<n;j++)
		{
			cin>>a[i][j];
			if(a[i][j]=='@')
			{
				sum++;
			}
		}
	}
	int m;
	cin>>m;
	for(int k = 1;k<m;k++)
	{
		for(int i = 0;i<n;i++)
        {
    	    for(int j = 0;j<n;j++)
    		{
    			aaa(i,j);
    		}
	    }
	    for(int i = 0;i<n;i++)
        {
    	    for(int j = 0;j<n;j++)
    		{
    			
    			if(a[i][j]=='!')
        		{
	        		sum++;
	        	 	a[i][j] = '@';
	        	}
    		}
    		
	    }
	    
	}
	cout<<sum;
	return 0;
}
void aaa(int i,int j)
{
	if(a[i][j]=='@')
	{
		if(a[i+1][j]=='.') a[i+1][j] = '!';
		if(a[i-1][j]=='.') a[i-1][j] = '!';
		if(a[i][j+1]=='.') a[i][j+1] = '!';
		if(a[i][j-1]=='.') a[i][j-1] = '!';
	}
}

#4194. 吃糖果2

题目描述

现有n(50 > n > 0)个糖果,每天只能吃2个或者3个,请计算共有多少种不同的吃法吃完糖果。

输入格式

输入的每一行包括一组测试数据,即为糖果数n。最后一行为0,表示测试结束。

输出格式

每一行输出对应一行输入的结果,即为吃法的数目。

样例

样例输入

复制1
2
3
4
12
0

样例输出

复制0
1
1
1
12
#include <bits/stdc++.h>
using namespace std;
int aaa(int);
int main()
{
	int a[1000];
	int n = 0;
	while(true)
	{
		int t;
		cin>>t;
		if(t==0) break;
		a[n] = t;
		n++;
	}
	for(int i = 0;i<n;i++)
	{
		cout<<aaa(a[i])<<endl;
	}
	return 0;
}
int aaa(int n)
{
	if(n==1||n==2||n==3||n==4) return 1;
	return aaa(n-2)+aaa(n-3);
}

#1007. 波兰表达式

题目描述

波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的波兰表示法为+ 2 3。

波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的波兰表示法为* + 2 3 4。

本题求解波兰表达式的值,其中运算符包括+ - * /四个。

输入格式

输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。

输出格式

输出为一行,表达式的值。

可直接用printf("%f\n", v)输出表达式的值v。

样例
样例输入
复制* + 11.0 12.0 + 24.0 35.0

样例输出

复制1357.000000
数据范围与提示

提示 可使用atof(str)把字符串转换为一个double类型的浮点数。atof定义在math.h中。 此题可使用函数递归调用的方法求解。 来源 计算概论05

#include <bits/stdc++.h>
#include <string.h>
#include <iostream>
#include <string>
#include <iomanip>
#include <math.h>
using namespace std;
double aaa();
int main()
{
	cout<<fixed<<setprecision(6)<<aaa();
	return 0;
}
double aaa()
{
	string s;
	cin>>s;
	if(s=="+") return aaa()+aaa();
	else if(s=="-") return aaa()-aaa();
	else if(s=="*") return aaa()*aaa();
	else if(s=="/") return aaa()/aaa();
	else return atof(s.c_str());
}

#5063. Minecraft

题目描述

Minecraft 是一个几乎无所不能的沙盒游戏,玩家可以利用游戏内的各种资源进行创造,搭建自己的世界。

在 Minecraft 中,基本的建筑元素是边长为 1 个单位的立方体,Tony 想用 N 个这种小立方体搭建一个长方体,并用他珍藏已久的贴纸对其进行装饰。

如果一张贴纸可以贴满小立方体的一个面。那么,他需要用掉多少张贴纸呢?

输入格式

一个整数 N,表示小明所拥有的小立方体的个数。N 不会超过 1000。

输出格式

一个整数,即小明最少用掉的贴纸有多少张。

样例

样例输入

复制9

样例输出

复制30

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int mi = 99999;
	int h,l;
	for(int i = 1;i<=n/3;i++)
	{
		for(int j = i;j<=n/3;j++)
		{
			if(n%(i*j)==0)
			{
				h = n/(i*j);
				l = i*j*2+i*h*2+j*h*2;
				if(l<mi) mi = l;
			}
		}
	}
	cout<<mi;
	return 0;
}

#4193. 因子问题

题目描述

任给两个正整数N、M,求一个最小的正整数a,使得a和(M-a)都是N的因子。

输入格式

包括两个整数N、M。N不超过1,000,000。

输出格式

输出一个整数a,表示结果。如果某个案例中满足条件的正整数不存在,则在对应行输出-1

样例

样例输入

复制35 10

样例输出

复制5
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i = 1;i<m;i++)
	{
		if(n%i==0&&n%(m-i)==0)
		{
			cout<<i;
			return 0;
		}
	}
	cout<<-1;
	return 0;
}

#4300. 「2023.09 三级」谁是你的潜在朋友

题目描述

“臭味相投”——这是我们描述朋友时喜欢用的词汇。两个人是朋友通常意味着他们存在着许多共同的兴趣。然而作为一个宅男,你发现自己与他人相互了解的机会并不太多。幸运的是,你意外得到了一份北大图书馆的图书借阅记录,于是你挑灯熬夜地编程,想从中发现潜在的朋友。 首先你对借阅记录进行了一番整理,把N个读者依次编号为1,2,…,N,把M本书依次编号为1,2,…,M。同时,按照“臭味相投”的原则,和你喜欢读同一本书的人,就是你的潜在朋友。你现在的任务是从这份借阅记录中计算出每个人有几个潜在朋友。

输入格式

第一行两个整数N,M,2 <= N ,M<= 200。接下来有N行,第i(i = 1,2,…,N)行每一行有一个数,表示读者i-1最喜欢的图书的编号P(1<=P<=M)

输出格式

包括N行,每行一个数,第i行的数表示读者i有几个潜在朋友。如果i和任何人都没有共同喜欢的书,则输出“BeiJu”(即悲剧,^ ^)

样例

样例输入

复制4 5
2
3
2
1

样例输出

复制1
BeiJu
1
BeiJu

 

#include <bits/stdc++.h>
using namespace std;
int a[10000] = {0};
int c[10000];
int main()
{
	int n,m;
	cin>>n>>m;
	
	for(int i = 0;i<n;i++)
	{
		cin>>c[i];
		a[c[i]]++;
	}
	cout<<endl;
	for(int i = 0;i<n;i++)
	{
		if(a[c[i]] >1) cout<<a[c[i]]-1<<endl;
		else cout<<"BeiJu"<<endl;
	}
	return 0;
}

#4173. 课程冲突 

题目描述

小 A 修了 n 门课程, 第 i 门课程是从第 ai 天一直上到第 bi 天。

定义两门课程的冲突程度为 : 有几天是这两门课程都要上的。

例如 a1=1,b1=3,a2=2,b2=4 时, 这两门课的冲突程度为 2。

现在你需要求的是这 n 门课中冲突程度最大的两门课的冲突程度。

输入格式

第一行一个正整数 n 表示课程数量。 接下来 n 行,每行两个正整数 ai,bi。 2 ≤ n≤ 1000, 1 ≤ ai ≤ bi ≤ 1000。

输出格式

输出一个整数表示最大的冲突程度。

样例

样例输入

复制3
1 3
2 4
5 5

样例输出

复制2
#include <bits/stdc++.h>
using namespace std;
int a[100];
int b[100];
int main()
{
	int n;
	cin>>n;
	for(int i = 0;i<n;i++)
	{
		cin>>a[i];
		cin>>b[i];
	}
	int ma = -99999;
	for(int i = 0;i<n-1;i++)
	{
		for(int j = i+1;j<n;j++)
		{
			int s = min(b[i],b[j])-max(a[i],a[j])+1;
			ma = max(ma,s);
		}
	}
	cout<<ma;
	return 0;
}

#5064. 踩方格 

题目描述

有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:

a、每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;

b、走过的格子立即塌陷无法再走第二次;

c、只能向北、东、西三个方向走;

请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。

输入格式

允许在方格上行走的步数n(n≤20)。

输出格式

计算出的方案数量。

样例

样例输入

复制2

样例输出

复制7
#include <bits/stdc++.h>
using namespace std;
int aaa(int);
int main()
{
	int n;
	cin>>n;
	cout<<aaa(n);
	return 0;
}
int aaa(int n)
{
	if(n==1) return 3;
	if(n==2) return 7;
	return aaa(n-1)*2+aaa(n-2);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值