2020年合肥市青少年信息学科普日活动小学组试题

本文提供了2020年合肥市青少年信息学科普日活动小学组的四道试题详解,包括点积运算、成绩统计、出队游戏和盲比多少游戏。涉及算法、数据统计和游戏策略等内容,适合信息学奥赛选手练习。

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

1、点积运算(dot 

点积在数学中,又称数量积,它是欧几里得空间的标准内积,在机器学习和人工智能中具有非常广泛的应用。二维空间内两个向量的点积定义为向量中对应各维坐标的乘积和。例如,向量 a=(a1,a2),向量 b=(b1,b2),则向量 a 和向

b 的点积为:a1*b1+a2*b2。请同学们计算二维空间内两个向量的点积。 

 

输入:输入数据共 2 行,第一行有两个用空格分隔的整数,表示第一个向量,第二行有两个用空格分隔的整数,表示第二个向量。  

 

输出:共 1 行一个整数,为两个向量的点积和。 

 

样例 1 

输入:(dot.in 

  1. 4
  2. 5

输出:(dot.out 

26

数据范围:1a1,a2,b1,b2100000

#include<iostream>
using namespace std;
int main(){
    int a1,a2;
    cin>>a1>>a2;
    int b1,b2;
    cin>>b1>>b2;
    cout<<a1*b1+a2*b2;
}

2、成绩统计(score)

期末考试结束了,学校已批改完所有试卷,已知某年级共有 n 位学生和他们对应的成绩。老师们想知道这个年级学生成绩的分布情况,以便下学期更好的开展教学,因此现在需要统计一些数据如下: 

  1. 全校最低分、最高分的成绩及人数; 
  2. 同分最多的成绩和人数,如果相同,依次由低分到高分输出; 
  3. 分值 p q 之间(包含 p q)人数。 

请同学们编程帮忙统计吧。 

输入:输入数据共 3 行。第一行一个整数 n,表示学校某年级总人数,第二行共有 n 个由空格分隔的正整数,表示每一位学生成绩。第三行共有 2 个由空格分隔的正整数 p q 

 

输出:共 4 行,第一行 2 个由空格分隔的正整数,对应最低的成绩及人数,第二行 2 个由空格分隔的正整数,对应最高的成绩及人数,第三行多个由空格分隔的正整数,对应多个相同分数最多的成绩及人数。第 4 1 个正整数,对应成绩 p q 之间人数。 

 

样例: 

输入:(score.in 

11

 80 85 80 78 90 95 95 80 98 78 95

 85 95

输出:(score.out 

78 2

98 1

80 3 95 3

          5

数据范围:1≤学生人数 n100000≤每个学生成绩≤500

 

//成绩统计
#include<bits/stdc++.h>
using namespace std;
int tong[510];//统计分数
int maxn=0;//同分最多的人 
int maxfen=0, minfen=500;//最高分  最低分 
int main(){
	int n, p, q, fen, i;
	cin>>n;
	for(i=1; i<=n; i++){
		cin>>fen;
		tong[fen]++;//装桶
		maxn=max(maxn, tong[fen]);
		maxfen=max(maxfen, fen);//最高分 
		minfen=min(minfen, fen);//最低分 
	} 
	cin>>p>>q;
	cout<<minfen<<" "<<tong[minfen]<<endl;
	cout<<maxfen<<" "<<tong[maxfen]<<endl;
	for(i=0; i<=500; i++){
		if(tong[i]==maxn){
			cout<<i<<" "<<maxn<<" ";//分数  人数 
		}
	}
	cout<<endl;
	int he=0;
	for(i=p; i<=q; i++){
		he=he+tong[i];//总人数 
	}
	cout<<he<<endl; 
	return 0;
} 

3、出队游戏(queue)

 秋冬季阳关明媚的上午,老师带领同学们在做一个游戏,首先同学们排成一列,然后从 1 开始依次给同学们一个编号,如果有 5 位同学,他们的编号依次为12345。游戏的规则如下: 

从队头开始依次按一、二、一、二、……报数,凡是报到数为二的出来; 

剩余的同学依次靠拢重新排成一列,从队头开始依次按一、二、三、一、二、三、……报数,凡是报到数为三的出来; 

重复第 ,直到剩余的人数不超过 3 为止。 

 

输入:输入数据只有一行一个正整数 n,表示学生人数。 

 

输出:一行由空格分隔的若干正整数。 

 

样例 1 

输入:(queue.in 

5

输出:(queue.out 

1 3 5

 

样例 2 

输入:(queue.in 

9

输出:(queue.out 

1 7

 

数据范围:4n10000

 

//出队游戏 (类似约瑟夫问题) 
#include<bits/stdc++.h>
using namespace std;
int main(){
	queue<int> q;
	int n, i;
	cin>>n;
	for(i=1; i<=n; i++){
		q.push(i);//队列 
	}
	int m, hao; 
	m=q.size();//初始人数 
	while(m>3){ 
		for(i=1; i<=m; i++){//偶数出列 
			hao=q.front();//队首
			q.pop();//出队列
			if(i%2!=0){
				q.push(hao);//重新入队列 
			} 
		} 
		
		m=q.size();//更新人数  
		if(m<=3) break;
		 
		for(i=1; i<=m; i++){//数3出列 
			hao=q.front();//队首
			q.pop();//出队列
			if(i%3!=0){
				q.push(hao);//重新入队列 
			} 
		} 
		m=q.size();//更新人数
	} 
	m=q.size();//更新人数
	for(i=1; i<=m; i++){
		hao=q.front();
		q.pop();//出队列 
		cout<<hao<<" ";
	}
	return 0;
} 

4、盲比多少游戏(game)

小强和小明两位小朋友在玩一个盲比多少的游戏,游戏规则非常简单:每次手握一定数量的小弹珠出拳,谁手中的小弹珠多,谁就算赢,赢家不仅可以获得输家本次出拳的小弹珠,还可以得到 50 积分的奖励,输家则被扣除 50 分奖励;如果弹珠数量一样,则不计积分。经过若干次的出拳,最后赢家就可以得到一定的积分。假设最后赢家是小强,你可以通过安排出拳时手握弹珠数量,使小强获得最多积分。开始时两人积分都为 0 

 

输入:共 3 行,第一行一个正整数 n1n1000),表示总共出拳次数,第二行有 n 个由空格分隔的正整数,表示小强每次出拳时手握的弹珠数,第三行有 n 个由空格分隔的正整数,表示小明出拳时手握弹珠数。注意出拳时手握弹珠数不一定按照给出的顺序进行。 

输出:共 1 行一个整数,表示小强可获得的最大积分。 

 

样例 1 

输入:(game.in 

  3

  1. 5 3
  2. 4 6

输出:(game.out 

50

样例解释:共出拳 3 次,第一次小强手握 1 个弹珠,小明手握 6 个弹珠,小强输;第二次小强手握 5 个弹珠,小明手握 4 个弹珠,小强赢;第三次小强手握个弹珠,小明手握 2 个弹珠,小强赢;小强两赢一输,总积分为 50 分。 

 

数据范围:1n1000,每次出拳时手握弹珠数不超过 500

//盲比多少游戏 (田忌赛马的贪心思想) 
#include<bits/stdc++.h>
using namespace std;
int n, qiang[1010], ming[1010];
int ying=0;//小强赢的次数
bool cmp(int a, int b){
	return a>b;//大的在前 
} 
int main(){
	int i;
	cin>>n;
	for(i=0; i<n; i++){
		cin>>qiang[i];//小强 
	}
	for(i=0; i<n; i++){
		cin>>ming[i];//小明 
	}
	sort(qiang, qiang+n, cmp);//从大到小排序
	sort(ming, ming+n, cmp);//从大到小排序
	int qz=0, qy=n-1;//小强左边界,右边界
	int mz=0, my=n-1;//小明左边界,右边界 
	while(qz<=qy && mz<=my){//[qz, qy],[mz, my]可以构成闭区间 
		if(qiang[qz]>ming[mz]){
		//小强最好>小明最好
			ying++;//(小强最好 VS 小明最好)
			qz++;
			mz++;	
		}else if(qiang[qy]>ming[my]){
		//小强最差>小明最差
			ying++;//(小强最差 VS 小明最差)
			qy--;
			my--;	
		}else{
			if(qiang[qy]<ming[mz]){
			//小强最差 < 小明最好
				ying--;	
			}
			qy--;
			mz++; 
		} 
	} 
	cout<<ying*50<<endl;
	return 0;
} 


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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值