2024年南海区中小学生程序设计水平测试 (小学甲组)

第1题 糖果

信息学课堂上,老师准备了一些糖,对于每次的提问,凡是举手要回答问题的同学都有可能拿到一颗糖,但同一个学生拿糖的时间至少要隔C秒(含C秒,第1次举手肯定能拿到糖)。已知这次课信息学老师共提问了N次,每次提问的时间为上课后的第T秒,小慧为了拿到很多糖,每次都举手了。问小慧最后拿到了多少颗糖。

输入格式

第一行两个整数,分别是N,C。

第二行N个整数,按顺序给出每次提问的时间Ti。

输出格式

一个整数,表示小慧能拿到的糖果数。

输入/输出例子1

输入:

6 5

1 3 7 8 10 12

输出:

3

样例解释

样例解释:

拿到糖的时间为:1、7、12

数据范围:

对于100%的数据,0<N,C<=3000,0<=Ti<=100000。

第2题 德育分

期末到了,小慧协助班主任统计同学们本学期的德育分情况,已知学号为1~n的n个同学的德育分,小慧有一次使用特权的机会,她可以把任意连续一段学号同学的德育分同时乘以C,问小慧使用特权后,全部同学的德育分总和最多为多少分?

输入格式

第一行,两个整数n和c;

第二行,n个整数,按学号顺序给出n个同学的德育分ai。

输出格式

输出一个整数,表示小慧能得到的最大德育分之和。

输入/输出例子1

输入:

9 3

-2 1 -3 4 -1 2 1 -5 4

输出:

13

样例解释

样例解释:

小慧把4~7号同学的分数同时乘以3,变为-2 1 -3 12 -3 6 3 -5 4,得到最大德育分数之和为13。

数据范围:

对于30%的数据,1<=n<=100,1<=c<=10,-100<=ai<=100;

对于80%的数据,1<=n<=10000,1<=c<=100,-1000<=ai<=1000;

对于100%的数据,1<=n<=100000,1<=c<=1000,-10000<=ai<=10000。

第2题 德育分

具体做法参见:这篇文章

期末到了,小慧协助班主任统计同学们本学期的德育分情况,已知学号为1~n的n个同学的德育分,小慧有一次使用特权的机会,她可以把任意连续一段学号同学的德育分同时乘以C,问小慧使用特权后,全部同学的德育分总和最多为多少分?

输入格式

第一行,两个整数n和c;

第二行,n个整数,按学号顺序给出n个同学的德育分ai。

输出格式

输出一个整数,表示小慧能得到的最大德育分之和。

输入/输出例子1

输入:

9 3

-2 1 -3 4 -1 2 1 -5 4

输出:

13

样例解释

样例解释:

小慧把4~7号同学的分数同时乘以3,变为-2 1 -3 12 -3 6 3 -5 4,得到最大德育分数之和为13。

数据范围:

对于30%的数据,1<=n<=100,1<=c<=10,-100<=ai<=100;

对于80%的数据,1<=n<=10000,1<=c<=100,-1000<=ai<=1000;

对于100%的数据,1<=n<=100000,1<=c<=1000,-10000<=ai<=10000。

第3题 圆环

具体做法参见:这篇文章

小慧拿着一个圆环玩耍,该圆环平均分成N格(编号为1…N),其中第i格与第i+1格相邻,第1格与第N格相邻。开始小慧左手握在位置1,右手握在位置2。对于每一步,小慧可以进行如下的操作:左手移动一格的位置或右手移动一格的位置(但是两手不能同时在同一格),如下图。

现在给出小慧Q次操作的目标位置,每次操作为:一个字母L或R、空格、目标位置数字,表示当前操作小慧的左手或右手到达的位置(每一次操作只能移动一只手),问她至少移动了多少步。

输入格式

第一行,2个正整数N,Q;

接下来Q行,每行第一个为字母L(左手)或R(右手),接着是一个正整数V(字母与数字用空格分开),表示左手或右手到达位置V;

输出格式

输出一个整数,表示Q次操作后小慧双手共移动了多少步。

输入/输出例子1

输入:

6 3

R 4

L 5

R 6

输出:

8

样例解释

样例解释:

右手从2到4,需移动2步,此时左手不动;

左手从1到5,需移动2步,此时右手不动;

右手从4到6,需移动4步,此时左手不动;

所以共移动了2+2+4=8步。

数据范围:

对于100%数据,3<=N<=100,1<=Q,V<=100。

第4题 字符串

具体做法参见:这篇文章

此处另外给出2种写法

#include <iostream>
#include <map>
using namespace std;

int main() {
	int n;
	for (cin >> n; n; --n) {
		string st;
		cin >> st;
		map<int, int> a;
		for (const char &c : st) {
			++a[c - 97];
		}
		int maxn = 0;
		for (const auto &[x, y] : a) {
			maxn = max(maxn, y);
		}
		int len = st.size();
		if (maxn * 2 <= len) {
			cout << (len & 1) << endl;
		}
		else {
			cout << 2 * maxn - len << endl;
		}
	}
	
	return 0;
}
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
int a[100];
bool cmp(int x, int y) {
	return x > y;
}
int main() {
	int n;
	for (cin >> n; n; --n) {
		string st;
		cin >> st;
		memset(a, 0, sizeof(a));
		size_t len = st.size();
		for (size_t i = 0; i < len; i++) {
			a[st[i] - 97]++;
		}
		sort(a, a + 26, cmp);
		while (a[1] != 0) {
			a[0] = a[0] - a[1];
			a[1] = 0;
			sort(a, a + 26, cmp);
		}
		cout << a[0] << endl;
	}
	
	return 0;
}

样例解释

小慧看到一段由n个小写字母组成的字符串S,她想让这个字符串变得尽可能短。她能进行的操作是:可以多次删除S中任意一对相邻且不同的字符。例如:如果S=“racoon”,那么通过删除一对字符,他可以得到字符串“coon”、“roon”、“raon”、“raco”,但无法得到“racn”(因为被删除的字母是相同的),也没法得到“rcon”(因为被删除的字母不是相邻的)。

问:通过进行任意次这种删除操作,小慧能得到的字符串S的最小长度是多少?

输入格式

第一行一个整数G,表示有G组测试数据;

接下来G行,每行一个字符串S;

输出格式

输出G行,每行一个整数,表示对应字符串S能得到的最小长度。

输入/输出例子1

输入:

5

aabc

abaca

avbvvcvvvd

abcdefg

dabbb

输出:

0

1

2

1

1

数据范围:

对于40%的数据,字符串S的长度<=10;

对于100%的数据,字符串S的长度<=10000,G<=5。

第5题 朋友

具体做法参见:这篇文章

小慧有很多朋友,为了方便,她把朋友标记为编号1至N。星期天,小慧准备去拜访一些朋友,已知她的第i个朋友在Ci时刻前(不含Ci)的时间是有空的,而小慧在S时刻起床,计划在S+Ti时刻拜访朋友i(有可能在同一时刻拜访多个朋友,且小慧只有在朋友有空的情况才能访友成功)。

现给出Q次询问,每次给出小慧希望周日至少能访友的数量V和她的起床时刻S。对于每次询问,如果小慧的希望能达成,则输出“YES”,否则,输出“NO”。

输入格式

第一行,整数N,Q;

第二行,N个整数,表示每个朋友被拜访的时限Ci;

第三行,N个整数,表示小慧计划拜访每个朋友的时刻Ti;

接下来Q行,每行2个整数V和S。

输出格式

输出Q行,每行一个“YES”或“NO”

输入/输出例子1

输入:

5 5

3 5 7 9 12

4 2 3 3 8

1 5

1 6

3 3

4 2

5 1

输出:

YES

NO

YES

YES

NO

样例解释

样例解释:

对于第一个询问,小慧在5时刻起床,则计划拜访每个朋友的时刻是[9,7,8,8,13],而她的朋友分别只能在[3,5,7,9,12]前拜访,因为9>3,7>5,8>7,8<9,13>12,所以她只能成功拜访第4个朋友。

对于第二个询问,小慧在6时刻起床,1个朋友都拜访不了。

对于第三个询问,小慧能拜访朋友3、4、5。

对于第四、五个询问,小慧能拜访朋友2、3、4、5。

数据范围:

对于40%的数据,1<=N,Q<=1000;

对于100%的数据,1<=N,Q<=100000,1<=Ci,Ti,S,V<=1000000。

第6题 数列

小慧最近学习了质数和合数,她对一个有n个数的数列a按下述方法生成了数列b:

1.把数列a的每个数全部放到数列b中;

2.对于数列a的每一个数ai,如果ai是质数,则把正整数中的第ai个质数放到数列b中,如果ai是合数,则把ai的最大因子(除了ai本身)放到数列b中;

3.把数列b中的2*n个数打乱顺序。

现在小慧给出了数列b的2*n个整数bi,问原来的数列a是哪些数?

输入格式

第一行,一个整数n,表示原数列a共有n个正整数。

第二行,2*n个整数,表示按规则生成的数列b。

输出格式

按从小到大的顺序输出原数列a的n个整数。

输入/输出例子1

输入:

3

3 5 2 3 2 4

输出:

2 3 4

样例解释

样例解释:

2是质数,第2个质数是3,3是质数,第3个质数是5,4是合数,其非本身的最大因子是2,因此原数列2 3 4按规则变成数列2 3 4 3 5 2,符合输入的b数组。

数据范围:

对于50%的数据,1<=n<=1000,2<=ai<=1000,2<=bi<=7919(即第1000个质数)。

对于100%的数据,1<=n<=100000,2<=ai<=100000,2<=bi<=1299709(即第100000个质数)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值