2022年包河区青少年信息学竞赛小学组试题解析

本文解析了2022年包河区青少年信息学竞赛小学组的四道题目,涉及最高分学生查找、颠倒数字判断、单词搜索及优先级排队等问题,旨在锻炼学生的算法思维和数据处理能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一题:最高分姓名 (name)

[问题描述]

学校给学信息学的同学举办一次小测试,现给出参与测试的同学姓名和分数,老师想表扬最高分的同学,请你把最高分的学生姓名输出来(最高分唯一)

[输入格式]

输入有n+1行, 第1行为1个正整数,表示数的个数:N (1到100之间的整数) 后N行有N个姓名(字符串)和分数(0到500之间的整数),用空格隔开

[输出格式]

最高分姓名

[样例输入]

2

wangdada 100

lixiaoxiao 99

[例输出]

wangdada

#include<iostream>
#include<algorithm>
using namespace std;
struct student{
	string name;
	int score;
};
int comp(student a,student b){
	return a.score>b.score;
}
int main(){
	student stu[101];
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>stu[i].name>>stu[i].score;
	}
	sort(stu,stu+n,comp);
	cout<<stu[0].name;
	return 0;
}

第二题:颠倒的数字(numbers)

[问题描述] 一些数字可以颠倒过来看,例如0、1、8颠倒过来还是本身,6颠倒过来是9,9颠倒过来看还是6.其他数字颠倒过来都不构成数字。类似的,一些多位数也可以颠倒过来看,比如106颠倒过来是901,颠倒的数字就是原数字。假设这个数字只由n位数字组成(n为整数,3<=n<=210),每一位都可以取0到9。请判断m个数字是不是颠倒后还是不是原数,还是原数就输出1,不是原数输出0

[输入格式]

m+1行,第一行一个整数m,m为int类型范围 后面m行整数,每一个整数占一行

[输出格式]

输出m行,每行不是1就是0

[样例输入]

2

1234

88888

[样例输出]

0

1

#include<iostream>
using namespace std;
int main(){
	int m;
	cin>>m;
	long long a[m];
	for(int i=0;i<m;i++){
		cin>>a[i];
	}
	for(int i=0;i<m;i++){
		int flag=1;
		long long k=a[i];
		while(k){
			k=k%10;
			if(k==0||k==1||k==6||k==8||k==9){
			}else{
				flag=0;
				break;
			}
			k=k/10;
		}
		if(flag==0){
			cout<<0<<endl;
		}else{
			cout<<1<<endl;
		}
	}
	return 0;
}

第三题:找单词游戏 (words)

[问题描述] 如何快速找到一行句子里最长和最短的单词,输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母、空格和逗号。单词由至少一个连续的字符构成,单词间的间隔可能是多个空格、句号和逗号,试输出第1个最长的单词和第1个最短单词。

[输入格式]

一行句子。

[输出格式]

第1行,第一个最长的单词.

第2行,第一个最短的单词。

[样例输入]

I love Hefei,I love learning Programming.

[输出]

Programming

I

#include<bits/stdc++.h>
using namespace std;
int main()
{
	char a[20000];
	cin.getline(a,200000);
	//gets(a); //输入数组
	int n=strlen(a); //计算长度
	int t=0;
	int max1,min1,max2,min2,maxn=0,minn=100; //1和2分别为起始位置和结束位置,
	                                        //带n的计算长度   
	a[n]=' '; //在最后一个单词后加空格,否则单词无法计算                                                                   
	for(int i=0; i<=n; i++) //枚举
	{
		if(a[i]!=' ' && a[i]!=','&&a[i]!='.') //如果是单词
			t++; //计数器加一
		else if(t>0) //否则
		{
			if(t>maxn) //如果大于最大
			{
				maxn=t; //计算长度
				max1=i-t; //起始位置
				max2=i-1; //结束位置
			}
			if(t<minn) //如果小于最小
			{
				minn=t; //同上
				min1=i-t;
				min2=i-1;
			}
			t=0; //计数器归0
		} 
	}
	for(int i=max1; i<=max2; i++) //输出最大和最小
		cout<<a[i];
	cout<<endl;
	for(int i=min1; i<=min2; i++)
		cout<<a[i];
	return 0; //养成好习惯
}

第四题:排队预登记 (line)

[问题描述] 排队是件头疼的事,在社区中登记信息有的时候需要排一个很长的队,但是其实每个人的优先级都不一样,比如我们可以采用预登记的方式,提前摸排人员情况,让年纪大的先排队,体现人文关怀。现在将预登记的人员按照以下原则排出的先后顺序:

1.老年人(年龄>= 60岁)比非老年人优先排队。

2.老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。

3.非老年人按登记的先后顺序排队。

4.残疾人不论年纪大小,一律上门做登记,不参与排队。

[输入格式]

第1行,输入一个小于100的正整数,表示个数; 后面按照登记的先后顺序,每行输入一个人的信息,包括:一个长度小于10的字符串表示人的ID(每个人的ID各不相同且只含数字和字母),一个整数表示人的年龄,另一个整数表示是否是残疾人,是为1,否为0,中间用单个空格隔开。

[输出格式]

按排好的顺序输出人的ID,每行一个

[样例输入]

6

21075 40 0

14003 15 0

10158 67 0

14658 57 1

21033 75 0

12012 30 0

[样例输出]

21033

10158

21075

14003

12012

#include<iostream>
#include<algorithm>
using namespace std;
struct people{
	string id;
	int age;
	int iscanji;
};
int comp(people a,people b){
	return a.age>b.age;
}
int main(){
	people p[101];
	people p1[101];//老年人 
	people p2[101];//非老年人 
	int n,j=0,k=0;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>p[i].id>>p[i].age>>p[i].iscanji;
		if(p[i].iscanji==0&&p[i].age>=60){
			p1[j++]=p[i];
		}else if(p[i].iscanji==0&&p[i].age<60){
			p2[k++]=p[i];
		}
	}
	sort(p1,p1+j,comp);
    for(int i=0;i<j;i++){
    	cout<<p1[i].id<<endl;
	}
	for(int i=0;i<k;i++){
    	cout<<p2[i].id<<endl;
	}
	return 0;
}

第五题:运输木材 (tree)

[问题描述]

牛牛家有一个林场,现有 条木材,每条木材的长度已知且均为正整数。木材可以以任意正整数长度切割,但不可以连接。假设木材直径都一致,现有卡车可装m条木材,但是卡车长度有限,现在要从这些木材中切割出 m 条长度相同的木材,为经济效益最大化,应该选择多长的卡车,求这些木材的最大长度是多少。

[输入格式]

第一行是一个不超过 100的正整数 n。

第二行是 n个不超过10的6次方的正整数,表示每条材的长度。

第三行是一个不超过10的8次方的正整数 m。

[输出格式]

绳段的最大长度,若无法切割,输出“Failed”

[样例输入]

3

30 20 55

4

[样例输出]

20

#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main()
{
    int n,m,l=0,r=100000001;
    cin>>n;
    for (int i=1; i<=n; ++i)
        cin>>a[i];
    cin>>m;
    while(r-l>1)
    {
        int mid=(l+r)/2;
        int sum = 0;
        for (int i=1; i<=n; ++i)
            sum += a[i]/mid;
        if(sum>=m) l=mid;
        else r=mid;
    }
    cout<<l;
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值