2019 年合肥市青少年信息学科普日活动

本文介绍了合肥市青少年信息学科普日活动中的几道题目,包括BMI指数计算、成绩统计、素数对猜想、最长连续重复字符、最小等待时间和银行排队模拟问题。涉及到算法和编程技巧的应用。

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

1、体质指数(bmi

体重和身高是人体最基本的数值,BMI 指数是用体重公斤数除以身高米数平方得出的数字,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。在亚洲标准中正常的指数应该是 18.5-24 之间,如果得到的 BMI 结果低于 18.5, 属于体重过低(可用 L 表示),在 18.5-24 之间属于正常(可用 N 表示),大于 24 则属于肥胖的行列(可用 H 表示)。已知某人的体重和身高,请计算他的 BMI 指数及属于哪一种情况。BMI=体重(kg)÷身高 2(m)

输入:输入数据共 1 行,有两个用空格分隔的数,分别表示体重(单位 kg)和身高(单位 m)

输出:共 1 行,有两个用空格分隔的值,其中第一个值是对应的 BMI,要求四舍五入,保留一位小数;第二个值为 L、N 和 H 中的一个。

样例 1:

输入:(bmi.in)

70 1.75

输出:(bmi.out)

22.9 N

BMI 数值只在输出时四舍五入,保留一位小数。

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
	double w, h;//体重、身高
	double bmi;
	cin>>w>>h;
	bmi=w/h/h;
	printf("%.1f ", bmi);
	if(bmi>24){
		cout<<"H"<<endl;
	}else if(bmi>=18.5){
		cout<<"N"<<endl;
	}else{
		cout<<"L"<<endl;
	}
	return 0;
} 

2、成绩统计(score)

合肥市某学校某年级共有 m 个班,每个班级都有 n 位学生。某次考试结束后,知道了每位学生的总分(整数),现在还要再统计一些数据:

1)每个班级的最高得分

2)每个班级的平均得分(四舍五入,保留一位小数)

3)所有学生总分低于一个分值 p 的人数和高于一个分值 q 的人数。

输入:输入数据共 m+1 行。第一行是 4 个由空格分隔的正整数 m、n、p、q,接下来 m 行,每行共有 n 个由空格分隔的正整数,表示每一位学生的总分,

输出:共 3 行,第一行 m 个由空格分隔的正整数,对应每个班级的最高分;第二行 m 个由空格分隔的数值,对应每个班级的平均分;第三行 2 个由空格分隔的正整数,分别表示低于 p 的人数和高于 q 的人数。

样例:

输入:(score.in)

3 4 150 290

260 300 140 190

290 280 260 270

190 280 300 190

输出:(score.out)

300 290 300

222.5 275.0 240.0

1 2

数据范围:

1≤m,n≤100 0≤每个学生总分≤300

#include<iostream>
#include<cstdio>
using namespace std;
int fen[1010][1010];
int maxx[1010], shup=0, shuq=0;
double pjf[1010];
int main(){
	int m, n, p, q;
	int i, j, shup=0, shuq=0;
	cin>>m>>n>>p>>q;
	for(i=0; i<m; i++){
		for(j=0; j<n; j++){
			cin>>fen[i][j];
			if(fen[i][j]>maxx[i]){
				maxx[i]=fen[i][j];//班级最高分 
			}
			if(fen[i][j]<p){
				shup++;//小于p分的人 
			} 
			if(fen[i][j]>q){
				shuq++;//高于q分的人 
			}
			pjf[i]=pjf[i]+fen[i][j];//计算总分 
		}
		pjf[i]=pjf[i]/n;//班级平均分 
	}
	for(i=0; i<m; i++){
		cout<<maxx[i]<<" ";
	}
	cout<<endl;
	for(i=0; i<m; i++){
		printf("%.1f ",pjf[i]);
	}
	cout<<endl;
	cout<<shup<<" "<<shuq<<endl;
	return 0;
}

3、素数对猜想(primep)

素数是指在大于 1 的自然数中,除了 1 和该数自身外,无法被其他自然数整

除的数,即只有 1 与该数本身两个正因数的数。素数对猜想认为存在无穷多对相邻且差为 2 的素数,如 5 和 7,17 和 19 等,给定一个数 n,请编程找出不超过 n 的满足猜想的素数对的个数。

输入:输入数据只有一行一个正整数 n。

输出:一个正整数 k,表示素数对的个数。

样例 1:

输入:(primep.in)

20

输出:(primep.out)

4

样例解释:小于 20 的素数对共有 4 对,分别是(3,5)(5,7)(11,13)(17,19)数据范围:

1≤≤n≤100000

#include<iostream>
using namespace std;
bool sushu(int n){
	int i;
	if(n==1){
		return 0;//不是素数 
	}else if(n==2){
		return 1;//是素数 
	}else if(n>2){
		for(i=2; i*i<=n; i++){
			if(n%i==0){
				return 0;//不是素数 
			}
		}
		return 1;//是素数 
	} 
}
int main(){
	int n, k=0, i;
	cin>>n;
	if(n<=2){
		cout<<0;
	}else{
		for(i=2; i<n; i++){
			if(sushu(i)==1 && sushu(i+2)==1){
				k++;//素数对 
			}
		}
		cout<<k<<endl; 
	}
	return 0;
}

4、最长连续重复字符(longest)

请统计输入的字符串中最大连续重复字符的个数,要求统计找出给定字符串中哪些字符连续出现的次数最多,并且要统计这些字符一共连续出现了多少次。例如:字符序列为 AAA222BBAAAaa,则在这个字符序列中,字符 A 和字符 2 连续出现的次数最多,都是 3 次。

输入:共两行,第一行为字母序列中的字母个数 n(1≤N≤1000),第二行为 n

个字符组成的字符串序列。

输出:共两行,第一行为最多连续出现次数最多的字符,若有多个用空格分隔, 输出顺序为他们在字符串中的先后顺序。第二行为连续出现重复的最大次数。

样例 1:

输入:(longest.in)

13

AAA222BBAAAaa

输出:(longest.out)

A 2

3

数据范围:

1≤n≤1000 33≤字符数值即 ASCII 码≤126

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int main(){
	int n;
	string str;
	int i=0, max=0, cnt=0;
	char mb[128]={0};//存储连续出现次数最多的字符
	cin>>n;
	cin>>str;
	while(i<n){
		char ch=str[i];
		int shu=1;//记录连续相同字符的个数
		for(i=i+1; str[i]==ch; i++){
			shu++; 
		} 
		if(shu>max){
			max=shu;//更新最大值 
			cnt=0;
			mb[cnt]=ch;
		}else if(shu==max){
			//去重
			int k; 
			for(k=0; k<=cnt; k++){
				if(mb[k]==ch){//有重复 
					break;
				}
			} 
			if(k>cnt){//没有重复 
				cnt++;//新增一个元素 
				mb[cnt]=ch;//相同的次数 
			} 
		}
	} 
	for(i=0; i<=cnt; i++){
		cout<<mb[i]<<" ";
	} 
	cout<<endl<<max<<endl;//最大次数 
	return 0;
}

5、最小等待时间(waiting)

超市的收银处有 n  位顾客在排队等着付款,他们的编号依次为 1,2,…,n。由于每个顾客所购的商品不同,因此付款时所需的等待时间也就不一样。给出这 n 个人每个人单独付款所需的时间。而顾客不同的付款顺序,所有顾客总等待时间是不一样的,收银员想知道所有顾客总等待时间最少是多少。

输入: 共2行,第一行为正整数n,表示排队的人数;第二行n个由空格分隔的正整数,分别为这n个人单独付款所需的时间。

输出: 共 1 行 1 个数,表示所有顾客总的最少等待时间。

样例 1:

输入:(waiting.in)

4

1 2 1 2

输出:(waiting.out)

7

样例解释:按顾客编号,排队顺序为 1 3 2 4,排序后第一位顾客不需要等待,第二位顾客需要等待时间为 1,第三位顾客需要等待时间为 1+1,第四位顾客需要等待时间为 1+1+2。总等待时间为 7。

数据范围:

1≤n≤100,每位顾客单独付款所需的时间≤150

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int n;
	int t[110];//时间
	int i, zong=0, tmp;//灯带总时间 
	cin>>n; 
	for(i=0; i<n; i++){
		cin>>t[i];//所有人的单独处理时间 
	}
	sort(t, t+n);//升序排序 
	for(i=1; i<n; i++){
		tmp=tmp+t[i-1];//第i个人的等待时间 
		//第i个人的等待时间
		zong=zong+tmp;//累加所有人的等待时间 
	} 
	cout<<zong<<endl; 
	return 0;
} 

6、银行排队(bank)

K 个人来银行排队办理业务,银行有 n 个窗口可以同时办理,每个窗口允许有

m 个人排队,其余的人在银行大厅等待。当某个窗口排队人数少于 m 时,在大厅等待的人可进入该窗口排队。每个人都有自己要办的业务,每个业务要花费一定的时间,银行的上班时间是早上 8 点到下午 17 点,若超过 17 点,就无法办理相关的业务了。有 q 次查询,查询 q 个顾客办理业务结束时的时间。对于无法办理相关业务的查询,输出 sorry。假设第一位顾客从早上 8 点开始办理业务,k

个顾客编号依次为 1、2…k。

输入:共 3 行,第一行 4 个由空格分隔的正整数,分别表示 n,m,k,q;第二行为 k 个由空格分隔的正整数,分别表示每个人办理业务所需时间。第三行为 q 个由空格分隔的正整数,分别表示每次查询时要查询的顾客编号。

输出:共 q 行,对应每次查询的结果,每个结果的格式为 hh:mm。

样例 1:

输入:(bank.in)

2 2 7 5

1 2 6 4 3 534 2

3 4 5 6 7

输出:(bank.out)

08:07

08:06

08:10

17:00

sorry

样例解释:该银行共有两个窗口,每个窗口可同时供 2 人排队,总共有 7 人需要办理业务,有 5 次询问,分别是编号为 3、4、5、6、7 的顾客结束时间;输出结果显示编号为 3 的顾客在 08:07 分结束,编号为 4 的顾客在 08:06 分结束,编号

为 5 的顾客在 08:10 分结束,编号为 6 的顾客在 17:00 分结束,编号为 7 的顾客在开始办理业务前,银行就下班了,所以输出 sorry。

数据范围:

1≤n≤10 1≤m≤5 1≤k,q≤100

补充说明:只要顾客在下班前开始办理业务,那就要将其办理完,因此,查询输出的结束时间有可能超过 17:00。

#include <iostream>
#include <queue>
#include <cstdio>
#include <string>
using namespace std;

struct person{
    int id;
    int cost_time;
    int start_time;
    int end_time;
};

int main(){
    
    int n, m, k, q, tmp, t = 0, cnt = 0;
    person a[101];
    queue<person> d[10];
    cin >> n >> m >> k >> q;
    for(int i = 1; i <= k; i++){
        cin >> tmp;
        a[i].id = i;
        a[i].cost_time = tmp;
        a[i].start_time = 0;
    }
    // 把队排满
    int last = min(k, m * n) + 1;
    for(int i = 1; i <= min(k, m * n); i++){
        if(!d[i%n].empty())
            a[i].start_time = d[i%n].back().start_time + d[i%n].back().cost_time;
        d[i%n].push(a[i]);//入队列 
    }
    while(cnt < k){
        t++;
        for(int i = 1; i <= n; i++){   // 针对市赛数据做队列遍历顺序的修改 
            if(i == n) i = 0;     
            if(d[i].empty()){
                if(i == 0) break;
                continue;
            }
            if(t - d[i].front().start_time >= d[i].front().cost_time){
                a[d[i].front().id].end_time = t;
                d[i].pop();
                if(!d[i].empty()){
                    d[i].front().start_time = t;
                    a[d[i].front().id].start_time = t;
                }
                cnt++;
                if(last <= k){//说明至少还有一个人在队外 
                    if(d[i].empty())
                        a[last].start_time = t;
                    d[i].push(a[last]);
                    last++;
                }
            }
            if(i == 0) break;    // 针对市赛数据,做的修改 
        }
    }
    for(int i = 1; i <= q; i++){
        cin >> t;
        if(a[t].start_time >= 540)
            cout << "sorry\n";
        else
            printf("%02d:%02d\n", 8 + a[t].end_time / 60, a[t].end_time % 60);
    }
    return 0;
}

云服务器ECS新春特惠https://www.aliyun.com/daily-act/ecs/fy22-12-yure?userCode=ht9l7cno

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值