2021级高级语言期末考复盘

2021级高级语言期末考复盘,第1张

A 得分

学院乒乓球循环赛开始了!每场三局两胜(因需打满三局,所以可能出现0:3或3:0的情况),每人胜一场得3分,败一场得1分。现在告诉你小明参加的比赛场次及他每场与他人的比赛情况,请你计算他的得分。也许你没玩过乒乓球,但算个分应该难不倒你。

输入格式:

首先输入一个整数T(1<=T<=10),表示测试组数。
每组测试首先在一行上输入一个整数m(1 输出格式:

对于每组测试,在一行上输出小明的得分。

输入样例:
1
3
2 1
1 2
0 3
输出样例:
5

思路:两个比较,定义计数器,初始为0,a>b,+3.a

#include
using namespace std;
int main(){
     int T;
	 cin>>T;
	 while(T--){
	 	int n;
	 	cin>>n;
	 	int a,b,cnt=0;
	 	for(int i=0;i>a>>b;
	 		if(a>b)cnt+=3;
	 		else cnt++;
		 }
		 cout<
B 计数 

计算在区间[1, n]范围内的所有整数中,数字x(0≤x≤9)共出现了多少次?
例如,在区间[1, 11],即在 1,2,3,4,5,6,7,8,9,10,11中,数字1出现了4次。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入2个整数n,x(1≤n≤1000000,0≤x≤9)。

输出格式:

对于每组测试,输出一行,包含一个整数,表示x出现的次数。

输入样例:
3
11 1
122 2
22 2
输出样例:
4
26
6

思路分析:定义查找函数,数位分离的数看看是否为要查找的数。返回等于要查找的数的出现次数。 

#include
using namespace std;
int shuwei(int n,int x){
	int cnt=0;
	while(n>0){
		int t=n%10;
		if(t==x)cnt++;
		n/=10;
	}
	return cnt;
}
int main(){
     int T;
	 cin>>T;
	 while(T--){
	 	int n,x;
	 	cin>>n>>x;
	 	int sum=0;
	 	for(int i=1;i<=n;i++){
	 		sum+=shuwei(i,x);
		 }
		 cout<
 C 偶数拆分

哥德巴赫猜想之一是指一个偶数(2除外)可以拆分为两个素数之和。因为同一个偶数可能可以拆分为不同的素数对之和,这里要求有几种拆分方案。注意,我们认为n=a+b和n=b+a是同一种方案,例如,30=13+17和30=17+13是同一种方案。

输入格式:

首先输入一个正整数T(T<100),表示测试数据的组数,然后是T组测试数据。每组测试输入1个偶数n(6≤n≤100000)。

输出格式:

对于每组测试,输出把n拆分为两个素数的方案总数。

输入样例:
3
30
20
26
输出样例:
3
2
3

思路:仍然为哥德巴赫猜想(集训)的思路,只不过这次是统计出现符合这个要求的次数。

#include
using namespace std;
bool ss(int n){
	if(n<2)return false;
	for(int i=2;i<=sqrt(n);i++){
		if(n%i==0)return false;
	}
	return true;
}
int main(){
     int T;
	 cin>>T;
	 while(T--){
	   int n;
	   cin>>n;
	   int cnt=0;
	   for(int i=n/2;i>=2;i--){
	   	if(ss(i)==true&&ss(n-i)==true)cnt++;
	   }
	   cout<
D 光棍串

据说2011年11月11日是百年光棍节。这个日期写成字符串是“20111111”,有6个1连续出现,小明把这样的字符串(有6个1连续出现,但可以在1之间有空格间隔)叫做光棍串,即“2011 11 11”也是光棍串。

输入格式:

输入数据的第一行为一个正整数T,表示测试数据的组数。然后是T组测试数据,每组测试输入1个字符串S(其中只包含空格与数字字符,长度不超过50个字符)。

输出格式:

对于每组测试,若S是光棍串,则输出“Yes”,否则输出“No”。

输入样例:
2
2011111
2011 11  11
输出样例:
No
Yes

思路分析:细节题,注意判断前面出现了6个1(连续),但是后面出现非1,导致cnt清0情况。因此需要对满足6个连续1,进行标记且退出循环(break)。

#include
using namespace std;

int main() {

	int T;
	cin>>T;
	cin.get();
	string s;
	while(T--) {
		
		getline(cin,s);
		//cin>>s;
		int cnt=0;
		int d=s.size();
		bool flag=true;
		for(int i=0; i
 E 图像8邻域极小值

一幅灰度图像可以看作一个二维数组,数组中每个元素对应图像中相应位置像素的灰度值(均为整数)。在图像处理中,8邻域极小值常作为一些分割算法的分割起始点。若与某一个像素点相邻的上、下、左、右、左上、右上、左下、右下8个点的灰度值都比该像素点灰度值大,则称该像素点为8邻域极小值点。给定一幅灰度图像(二维数组),请你编写程序,查找该数组中的8邻域极小值点。
注意:对于边缘(图像最外围一圈)的像素点,只需根据其存在的相邻点进行判断即可(参见样例)。

输入格式:

首先输入一个整数T(1<=T<10),表示测试组数。
每组测试输入包含两部分,第一行包含2个整数,分别为图像行数r(10>r>1)、列数c(10>c>1),接下来为相对应的图像信息(二维数组)。

输出格式:

对于每组测试,输出和原图像尺寸相同的二维数组(r行c列),所有8邻域极小值点位置输出为1,其余位置为0。另外,每组测试之间留一个空行。

输入样例:
3
2 3
6 2 5
7 6 1
3 3
9 5 6
6 2 3
4 9 8
5 5
56 9 32 15 4
2 5 8 6 7
20 15 67 32 10
3 5 8 4 3
23 54 24 36 9
输出样例:
0 0 0
0 0 1

0 0 0
0 1 0
0 0 0

0 0 0 0 1
1 0 0 0 0
0 0 0 0 0
1 0 0 0 1
0 0 0 0 0

思路分析:采用方向数组,在不越界的情况下,对每个数的八个方向数与它本身进行比较,有一次方向数比它小或等则为flase。定义方向数组定义错。

#include
using namespace std;
int dist[8][2]={{-1,-1},{-1,0},{-1,1},{0,1},{0,-1},{1,0},{1,-1},{1,1}};
bool  jimin(int a[][10],int i,int j,int n,int m){
        int x,y;
        int min=a[i][j];
        //bool flag=true;
        for(int k=0;k<8;k++){
                x=i+dist[k][0],y=j+dist[k][1];
                if(x>=0&&x=0&&y=a[x][y])return false;
        }        //return true;        
        }
        return true;
//        cout<>T;
        N=T;
        int a[20][20]={0};
        int b[10][10];
        while(T--){
                int n,m;
                cin>>n>>m;
                int a[10][10];
                for(int i=0;i>a[i][j];
                        }
                }
                for(int i=0;i0)cout<<" ";
                                cout<
 F 报销

年底,报销都挤在一堆,财务忙得不可开交。每个报销表包括姓名,各项费用的金额。对于每个报销单,这里规定按如下要求处理:

  • 金额高的优先处理;
  • 若金额相等时,则姓名字典序小的优先处理;
  • 若金额和姓名都相等,则按报销单来得早的优先处理。

请帮财务排好报销单的处理顺序。

输入格式:

首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。对于每组测试数据,先输入2个正整数n、m(1≤n≤20,1≤m≤10),然后是n行输入,第i行先输入第i个报销单上的姓名(长度不超过10个字符,且只包含大小写英文字母),然后再输入m个整数,表示第i个报销单上的各项费用,数据之间都以一个空格分隔,第i行输入的编号为i,编号越小表示来得越早。

输出格式:

对于每组测试,输出n+1行,第一行是“Case k:”,其中k表示是第k组测试;对于后面的n行,每行包含一个按规定要求排好序之后的报销单信息,包括:费用排名(从1开始,费用相同则排名也相同)、原编号、姓名、总费用,每两个数据之间留一个空格。每两组测试数据之间留一个空行。

输入样例:
2
3 5
Tom 100 900 200 100 700
Jack 1000 400 500 50 50
Sara 700 100 200 1000 300
3 2
Tom 2600 400
Jack 3800 800
Mary 3100 100
输出样例:
Case 1:
1 3 Sara 2300
2 2 Jack 2000
2 1 Tom 2000

Case 2:
1 2 Jack 4600
2 3 Mary 3200
3 1 Tom 3000

思路分析:结构体+cmp,按大小和按输入次序排序。多的是输出case,定义一个临时变量实现case后数值变化。

#include
using namespace std;
struct s{
	string name;
    int sum;
    int cnt;
};
bool cmp(s a,s b){
	if(a.sum!=b.sum)return a.sum>b.sum;
	if(a.name!=b.name)return a.name>T;
	s q[101];
	int g=1;
	while(T--){
		int n,m;
		cin>>n>>m;
		for(int i=0;i>q[i].name;
			//q[i].sum=0;
			int dnt=0;
			for(int i=0;i>t;
				dnt+=t;
			}
			q[i].sum=dnt;
			q[i].cnt=i+1;
		}
		sort(q,q+n,cmp);
		cout<<"Case "<0)cout<

G 链表合并与去重  

本题要求使用自定义链表或使用STL之list完成。

输入正整数n,再输入两行递增有序的整数(每行n个),创建两个升序单链表La、Lb,然后合并这两个单链表得到一个升序单链表Lc。注意,合并后的链表Lc中不得包含重复数据。要求先输出链表Lc,再把Lc逆置输出。

输入格式:

首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据首先在第一行输入数据个数n;再在第二行和第三行分别输入n个依次递增有序的整数。

输出格式:

对于每组测试,输出2行,第一行输出合并后的升序链表(无重复数据),第二行输出逆置后的降序链表。每行的每两个数据之间留一个空格。

输入样例:
1
5
1 3 5 7 9
4 6 9 10 12
输出样例:
1 3 4 5 6 7 9 10 12
12 10 9 7 6 5 4 3 1

思路分析:list建立两个链表,定义临时变量t,输入t,然后传到两个单链表内push_back。然后调用la.merge(lb).去重为合并后用la.unique()即可。

#include
using namespace std;
int main(){
	int T;
	cin>>T;
	
	while(T--){
	listla;
	listlb;	
		int n;
		cin>>n;
		for(int i=0;i>t;
			la.push_back(t);
		}
		for(int i=0;i>t;
			lb.push_back(t);
		}
		la.merge(lb);
		la.unique();
	for(list::iterator it=la.begin();it!=la.end();it++){
		if(it!=la.begin())cout<<" ";
		cout<<*it;
	}
	cout<::iterator it=la.begin();it!=la.end();it++){
		if(it!=la.begin())cout<<" ";
		cout<<*it;
	}
	cout<

感想:还不够强,数据结构学的不是很好,暑假好好补。同时,多打codeforces,锻炼自己的编程技术。 

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1324268.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-12
下一篇2022-06-12

发表评论

登录后才能评论

评论列表(0条)