西电22-23C语言期末考试

蒟蒻整理,持续更新

2023.1.12 晨曦

综合报告

悲报

由于晨曦的概率论科目过了,所以晨曦上来更新了一下,但是晨曦的电路和数电,大雾,数据结构还在嗷嗷待哺,为了让晨曦的这些科目能够及格,晨曦咕咕咕掉了所有的内容。

XDOJ 往年题对照和 XDACOJ 可做题目

带链接的是 XDOJ 的题目,你可以直接在上面查看。

部分题目上线到 XDACOJ ,该站为非官方 OJ ,请自行根据需求进行注册。本站不再进行内容更新。

第一场

T1 方差计算 XDOJP671

T3 时间处理 XDACOJP4561

T4 回文数 XDACOJP4559

T5 歌唱比赛评分 XDOJP699

第二场

T2 交换最大值和最小值 XDOJP696

T3 信号解调 XDOJP674

第三场

T1 可构造三角形数量 XDOJP675

T2 ROT13加密 XDOJP676

第四场

T2 平滑滤波 XDOJP683

T3 有序序列插值 XDOJP693

第五场

T2 校验和 XDOJP686

T3 出现次数最多的数 XDOJP688

第六场

T1 模式匹配 XDOJP681

T2 最长的整数序列 XDOJP702

声明

根据考试讨论得出,仅供参考,不保证其内容和考试内容完全一致。

你大概可以认为

以下场次的题目描述,数据范围和约定会可能和考试有一定区别,但保证算法和解题思路一致

原则上不会对算法复杂度进行约定。

某个闲批曾经开了个大概 4GB 的数组,过了,诶嘿!

可能有少许错误和遗漏,请见谅,也欢迎提出建议和意见。

本文件的题目描述**可能并不符合出题规范**,请谅解。

如果你对本文的名词有不了解的地方,可以参阅 oi-wiki.org

如果你有 **ACM比赛水平 ** 或 OI经历 ,你可以忽略这篇文章。

范围和赋分情况

期末机考共5道题目,2小时。考核内容包括:循环、一维和多维数组、字符串处理、指针、结构体、函数编写以及综合运用等。

每道题目的权重不同,加权按照分数高的优先加权

比如考试 4 题,题目按照 0.4,0.3,0.2,0.1 的赋分的方式,题目得分分别为 50,100,80,100,则最终得分为100*0.4+100*0.3+80*0.2+50*0.1=91 分。

常规场次的加权是 0.4,0.3,0.15,0.1,0.05 。

事故场次的加权是 0.4,0.3,0.2,0.1,仅取分高的前四题计算。

整体难度

考高分不难,虽然难度有所拔高,但仍然是最简单的科目

期中/期末做出一题约为总评 58 分水平,做出两题约为总评 79 分水平,做出三题约为 91 分水平。

在含有部分分的情况下,以上的分数可以更高。

总体来说题目难度并不是很大,对算法的考察几乎为0,所有看似需要算法的题最后都可以用暴力解决。但对语言的考察则比较高,包括对函数,结构体,指针,字符串的一些考点融合,也提高了题目的难度。

今年的考试新增了一道题型,也符合预期的期望,也就是函数补全题(P398的字符串压缩指向性很明显),也意味着你不会相关的知识点就做不出来,对语言的掌握要求有所提高。但还是有点小震惊(我以为电专不会出结构体融合的,我只要简简单单得结构体的sort!)

为什么我去年写这坨构使话啊去年的自己好菜喵

狗大模拟去死吧!

无所谓,树剖佬二十几分钟出来,我一个多小时出来也没问题

不同场次的难度也不同,像包含拔尖、卓越、教改班的场次和其他场次就有非常明显的难度区别(看场次五,我这个菜菜很幸运跟他们一起考哇),对于出现突发事故的场次(场次三),则会采取修改分数权重,降低题目难度,重考等方式解决(看延迟场次六和重考场次七)。

突发事故

考试情况中出现过服务器崩溃导致考试延期,或者本场考试评测中断,需要通过学生邮箱进行代码提交的情况,直接从IOI赛制改成OI赛制

以下为22级原第三(事故)场次班级的消息公告

同学们好!
在 3 月 4 日下午 14:00~16:00 进行的 2022~2023 年度《计算机导论与程序设计》课程期末考试过程中,15:30 分左右出现服务器登录异常情况,无法提交程序,虽然考试时间进行了延长,但服务器依然没有恢复正常,最终同学们还是无法将程序提交到服务器。
考试结束后,课程组及时对本场考试学生提交的程序进行了评判,由于本场考试出现突发状况,经过课程组反复沟通协商,本场考试只选取大家提交程序的前 4 道题目(总共 5 道题目)计入总分。每道题目原始满分 100 ,按照题目得分从高到低的顺序,分别按照 0.4,0.3,0.2,0.1 的比例计入最终期末考试总分。
经过上述处理后,考试成绩整体仍然不太理想,为了保证学生的切身利益,现决定对原 3 月 4 日下午 14:00~16:00 课程期末考试进行重新考试。具体细则如下:
1.重考时间暂定 3.12 日晚,考试形式为上机考试。
2.学生自愿决定是否参加考试,如果参加重考,以重考成绩计入课程期末考试成绩;如不参加重考,以第一次考试成绩计入课程期末考试成绩。
3.参加重考学生在群里接龙报名,报名截止时间 3.9 日 20:00 。

备考建议

  • 熟悉考试规则和考试范围。清楚考试场次。进入考场的时候双卡双带(学生卡,身份证),通信设备和其他携带物品按考场规则保管(我们那场可以手机关机自行保存)。进入考场后自行选择座位。记得带笔,考试发放草稿纸且并须签到
  • 注意环境调试。考试的编译环境和平时的编译环境有所区别,可能只能用DEV-C++的IDE(那VS能用吗),且小概率出现程序崩溃,电脑死机等情况。提前熟悉环境,可以适当打部分模板,进行几次编译和调试。
  • 调整编译配置。在编译器设置里面选择显示最多警告信息,或在编译时加入-Wall-Wextra命令。适合各种沙雕错误的检测。
  • 善用std,和万能头bits/stdc++.h,可以根据自己的能力使用。考试未对其进行限制。有报告说考试禁止了math.h/cmath头文件的使用,具体情况不明。
  • 做完题后直接提交,鉴于电专的土豆服务器,在前一个半小时,判题时间约为 5 秒,在后半个小时判题时间会急速增加。最后 15 分钟可默认判题不会给出结果(Cu佬:是NOIP赛制喵~)
  • 优先简单题,你分高的题目权重也高,所以简单题的 AC 可能可能会比难题的部分分容易,请自己根据考试情况进行调整。
  • 放平心态。C 语言再差不会到哪去的,干了兄弟们,冲!
  • 常见错误
  • C++语言基础简介
  • Dev-C++

考试规则

本规则为2022版本,请以最新官方版本为准。

《计算机导论与程序设计》期末机考注意事项

  1. 开考15分钟后,一律不允许进入考场考试;开考15分钟内不允许离开考场;
  2. 除了与学校统一安排的活动冲突情况之外,考生不允许随意调整考试场次;如果有特殊情况需调整考试场次,须考试两天前提出申请,并提交由任课教师及辅导员签字同意的书面申请书;
  3. 考生必须携带身份证和一卡通;
  4. 机考时考生不允许携带并使用U盘等电子设备,否则按作弊处理;
  5. 机考时一律不允许携带任何纸质材料、书籍和草稿纸(机考时,会统一发放草稿纸),否则按作弊处理;
  6. 服务器做了扩容,请考生按照机房公布的网址登录考试系统;
  7. 机考时考生采用学号作为账户和密码登录,请不要随意更改密码;
  8. 机考时限定每个考生的IP,登录成功后,若无特殊情况,不允许随意更换机器;
  9. 有问题请于考试期间及时提出,每做完一道题目提交一个程序,不要重复提交,不要频繁刷新,不要等到最后几分钟才提交所有题目,考试结束前没有及时成功提交的程序一律视为无效;
  10. 考生离场时请关闭计算机;
  11. 如果发现雷同程序将进行处理,最终成绩为题目考试成绩除以雷同人数。

*第六条,服务器做了扩容…

场次一

T1 方差计算

求 $n$ 个正整数的方差。

保证运算过程中的数均为整数。

一般地,求$s^2=\frac1n\Sigma_{i=1}^n(x_i-\overline x)^2$ 。

输入格式

第一行是一个整数,表示数的个数 $n$。

接下来一行有 $n$ 个整数 $a_i$。

输出格式

一个数,运算结果。

输入输出样例

输入 #1

1
2
5
1 2 3 4 5

输出 #1

1
2

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq n \leq 100$,$1 \leq a_i,b_i \leq 10^4$。

T2 矩阵处理

你现在需要处理一个 $n$ 阶方阵 $A$ 。

第一步,首先将方阵 $A$ 的右上三角元素加 1 ,左下三角元素减 1 ,主对角线部分不变,记为方阵 $B$ 。

然后找方阵 $B$ 中的最大值,这里以值为第一关键字,以 $i$ 为第二关键字,以 $j$ 为第三关键字,下标从0开始计算。

最后把方阵 $B$ 的元素乘上最大值,记为方阵 $C$ 。

分别输出方阵 $B$ ,方阵 $B$ 的最大值,方阵 $C$ 。

输入格式

第一行是一个整数,表示方阵的阶数 $n$。

接下来 $n$ 行共有 $n^2$ 个整数,分别表示方阵中的元素 $a_{ij}$。

输出格式

首先输出方阵 $B$ 。

接下来的一行,按照 a[i][j] = max的格式进行输出,其中 $a$ 为二维数组, $i,j$ 为最大值坐标, $max$ 为最大值。注意等号左右的空格。

最后输出方阵 $C$ 。

输入输出样例

输入 #1

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

输出 #1

1
2
3
4
5
6
7
8
9
1 2 2 2
0 1 2 2
0 0 1 2
0 0 0 1
a[0][1] = 2
2 4 4 4
0 2 4 4
0 0 2 4
0 0 0 2

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq n \leq 100$,$-10^4 \leq a_i,b_i \leq 10^4$。

T3 时间处理

你需要编写 adjust 函数,来计算在一个时间点后的时间变化。

其中 now 为现在的时间(用时分秒表示),delta 为增减的时间(用时分秒表示),direction 为时间改变的方向,当 direction 为 1 时代表时间向后走(从 14 点到 15 点),当 direction 为 -1 时代表向前走(从 14 点到 13 点)。

adjust 函数会返回一个整数 same_day ,如果其值为 0 代表改变后的时间在同一天,其值为1代表改变后的时间和原时间不在同一天。

本题限制

使用提交函数代码片段的形式进行。

提交的函数为以下函数。

1
int adjust (TIME *now, TIME *delta; int direction);

程序代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
typedef struct {
int hour;//0~23;
int minute;//O~59
int second;//O~59
} TIME;
int adjust (TIME *now, TIME *delta, int direction);
int main() {
TIME now, delta;
int direction;
scanf("%d", &direction);
scanf("%d %d %d", &now.hour, &now.minute, &now.second);
scanf("%d %d %d", &delta.hour, &delta.minute, &delta.second);
int same_day;
same_day = adjust(&now, &delta, direction);
printf("%d %d %d %d", same_day, now.hour, now.minute, now.second);
return 0;
}

输入格式

第一行为整数 direction ,表示时间改变方向。

第二行为三个整数,分别表示 now 的时,分,秒。

第三行为三个整数,分别表示 delta 的时,分,秒。

输出格式

一行,分别为 same_day ,和改变后时间 now 的时,分,秒。

输入输出样例

输入 #1

1
2
3
1
13 40 36
2 10 35

输出 #1

1
0 15 51 11

数据规模与约定

  • 对于 100% 的数据,保证 $0 \leq h \leq 23,0 \leq m \leq 23,0 \leq s \leq 59,dir\in{-1,1}$。

T4 回文数

循环/字符串

求一个数是否是回文数,如果这个数不是回文数,就让这个数加上自己的回文数,然后再判断。如此循环过后,输出最后的回文数和操作次数(若这个数本身会回文数,操作次数为 0 )。

计算的范围不会超过int。

输入格式

第一行是一个整数 $n$。

输出格式

两个数,分别为回文数和操作次数。

输入输出样例

输入 #1

1
114

输出 #1

1
525 1

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq n \leq 10^4$。

T4参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <bits/stdc++.h>
#define ll long long
#define MAXN 10000
using namespace std;

int huiwen(int n) {
int ans = 0;
while (n) {
ans = ans * 10 + n % 10;
n /= 10;
}
return ans;
}

int main() {
int num, cnt = 0;
cin >> num;
while (num != huiwen(num)) {
num += huiwen(num);
cnt++;
}
cout << num << " " << cnt << endl;
return 0;
}

T5 歌唱比赛评分

有 $n$ 个评委进行评分,按照评分规则,一般要去掉最高分和最低分再取平均分作为最终分数。

但是,由于这些评委中有一个组长,当组长的为最高分或者最低分时,组长的分数有效。

求平均分,采用单精度浮点,最终结果保留小数点后二位

输入格式

第一行是两个整数,评委人数 $n$ 和组长编号 $t$ 。

接下来的一行是 $n$ 个整数 $a_i$ ,代表评委的评分。

输出格式

一行,平均分。

输入输出样例

输入 #1

1
2
5 5
1 2 3 4 5

输出 #1

1
3.50

说明 #1

由于 5 号为组长,故其最高分有效,1 号的最低分则无效。

数据规模与约定

  • 对于 100% 的数据,保证 $3 \leq n \leq 10^3,1 \leq t \leq n,0 \leq a_{i} \leq 10^4$。

场次二

T1 矩阵处理

给以一个 $5*5$ 的矩阵,先将矩阵按行进行升序排序,再将矩阵按列进行升序排序。

输入格式

$5*5$ 的矩阵$A$ 。

输出格式

经过处理后的矩阵。

输入输出样例

输入 #1

1
2
3
4
5
5 4 3 2 1
6 5 4 3 2
8 7 6 5 4
7 6 5 4 3
4 3 2 1 0

输出 #1

1
2
3
4
5
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8

说明 #1

按行升序排序后的结果应该为

1
2
3
4
5
1 2 3 4 5
2 3 4 5 6
4 5 6 7 8
3 4 5 6 7
0 1 2 3 4

数据规模与约定

  • 对于 100% 的数据,保证 $-10^4 \leq A_{ij} \leq 10^4$。

T2 交换最大值和最小值

给一个带有 $n$ 个数的数列,先将这个数列的最大值和这个数列的第一个元素交换,再将交换后数列的最小值和这个数列的最后一个元素交换。如果同时拥有多个最大值和最小值,优先交换靠前面的最值元素。

输入格式

第一行一个正整数 $n$ 。

第二行为 $n$ 个元素 $a_i$ 。

输出格式

一行,为交换后的数列。

经过处理后的矩阵。

输入输出样例

输入 #1

1
2
6
1 1 4 5 1 4

输出 #1

1
5 4 4 1 1 1

说明 #1

最大值为第四个元素,在交换后5 1 4 1 1 4数列的最小值为第二个元素。

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq n \leq 100$,$-10^4 \leq a_i \leq 10^4$。

T3 信号解调

给出 $n$ 个点的整数坐标,判断其离坐标 $(-4,-4)$ 近还是离 $(4,4)$ 近。若离 $(-4,-4)$ 近,输出 1 ,否则输出 0 。

保证不会出现距离相等的情况。

输入格式

第一行是一个整数,表示坐标的数量 $n$。

接下来 $n$ 行共有 $2n$ 个整数,分别表示坐标 $a_i,a_j$。

输出格式

输出 $n$ 行,为1或0。

输入输出样例

输入 #1

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

输出 #1

1
2
3
1
1
0

输入 #2

1
2
1
0 0

输出 #2

1

说明 #2

由于出题人太懒了,把输出删了,你自己猜去吧。

真实考试中含有此类型数据,但题目并未说明,故在此标注。

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq n \leq 100$,$-10^4 \leq a_i,b_i \leq 10^4$。

T4 足球比赛

感谢 $Cu$ 的帮助!

在一场足球比赛中,我们要根据球队的表现情况对球队进行评分。一个球队的表现可以表示如下:

1
2
3
4
5
6
7
8
typedef struct{
char name; // 球队名称
int win; // 胜场数
int lose; // 负场数
int draw; // 平局数
int goal; // 进球数
int goad; // 被进球数
} TEAM;

现有球队 $A$ ,$B$ ,你需要根据以上数据对两球队进行排名。排名规则如下:

  1. 球队每赢一局,即可获得 $3$ 个积分;每平一局获得 $1$ 个积分 ;每输一局不获得积分。积分 更大的球队排名更高。

  2. 积分 相同,则 进球数 - 被进球数 更大的球队排名更高。

  3. 进球数 - 被进球数 相同,则 进球数 更大的球队排名更高。

  4. 进球数 相同,则认为两球队排名相同。

若 A 的排名高于 B ,则返回正数 ;若 A 的排名等于 B ,则返回 0 。若 A 的排名低于 B ,则返回负数。

现在,请你编写一个函数,来判定两球队排名的高低。

本题限制

使用提交函数代码片段的形式进行。

提交的函数为以下函数。

1
int compare(TEAM *A, TEAM *B);

程序代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
typedef struct{
char name; // 球队名称
int win; // 胜场数
int lose; // 负场数
int draw; // 平局数
int goal; // 进球数
int goad; // 被进球数
} TEAM;
int compare(TEAM *A, TEAM *B);
int main() {
TEAM qwq, qaq;
scanf("%c%d%d%d%d%d", &qwq.name, &qwq.win, &qwq.lose, &qwq.draw, &qwq.goal, &qwq.goad);
scanf("%c%d%d%d%d%d", &qaq.name, &qaq.win, &qaq.lose, &qaq.draw, &qaq.goal, &qaq.goad);
if (compare(&qwq, &qaq) > 0)
printf("TEAM QWQ");
else if (compare(&qwq, &qaq) == 0)
printf("QWQ QAQ");
else
printf("TEAM QAQ");
return 0;
}

输入格式

两行,分别为 qwq 的各成员值和 qaq 的各成员值。

输出格式

一行,分别代表两队的输赢情况的字符串。

输入输出样例

输入 #1

1
2
X 1 1 4 5 1 4
Y 1 9 1 9 8 1

输出 #1

1
TEAM QWQ

数据规模与约定

对于 100% 的数据,保证 $0$ $≤$ $win$ ,$lose$ … $goad$ $≤$ $10^3$ 。

T5 分解正整数

对于一个正整数 $n$,我们都可以把其分解为若干个连续正整数 $a_{i},a_{i+1},…a_{j}$ 。现在如果一个正整数有多种可能的分解序列,输出其所有的序列,如果不存在这样的序列,输出-1。

输入格式

一个整数,正整数 $n$。

输出格式

所有可能的情况序列,按照一个序列一行,按照分解数字个数从少到多的情况输出。

若不存在输出-1。

输入输出样例

输入 #1

1
15

输出 #1

1
2
3
7 8
4 5 6
1 2 3 4 5

输入 #2

1
2

输出 #2

1
-1

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq n \leq 10^3$。

场次三

本场次为事故场次。

T1 可构造三角形数量

给 $n$ 条边,判断有多少个连续的三条边($a_i,a_{i+1},a_{i+2}$,可以有 $n-2$ 组),可以组成三角形?

输入格式

第一行一个正整数 $n$。

接下来的一行,分别输入 $n$ 个正整数边长 $a_i$ 。

输出格式

一行,可构造的三角形数量。

输入输出样例

输入 #1

1
2
5
3 4 5 12 13

输出 #1

1
2

说明 #1

$3,4,5$ 和 $5,12,13$ 可以组成三角形,$4,5,12$ 则不可以。

数据规模与约定

  • 对于 100% 的数据,保证 $3 \leq n \leq 100$,$1 \leq a_i \leq 10^4$。

T2 ROT13加密

ROT13是一种古老加密方法,其加密原理是把一个字母用字母表位置相距13的字母来进行替换,如字母 $a$ 换成字母 $n$ , 字母 $b$ 换成字母 $o$,……字母 $z$ 换成字母 $m$ 。现在你需要输入一段字符串,然后将其中的大小写字母按照加密方法进行加密,其他字符保持不变。

输入格式

一行,长度 $src$ 的字符串。

输出格式

一行,加密后的字符串。

输入输出样例

输入 #1

1
stoXZHorz %%%

输出 #1

1
fgbKMUbem %%%

说明 #1

注意空格。

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq src \leq 100$。

T3 相邻区域求和

对于一个 $5*5$ 的二维数组,现在要求这个数组中的最小元素的下标(以值为第一关键字,i为第二关键字,j为第三关键字),其中下标从0开始计算。

并且求出这个最小元素相邻区域(上下左右,可能会出现相邻区域只有三个元素或两个元素的情况)的值总和。

输入格式

5 行,每行 5 个元素 $a_{ij}$ 。

输出格式

第一行为最小值的坐标,用i,j的形式,下标之间用逗号隔开。

第二行为相邻区域的值总和

输入输出样例

输入 #1

1
2
3
4
5
1 1 4 5 1
4 1 9 1 9
8 1 0 1 1
4 5 1 4 1
9 1 9 8 1

输出 #1

1
2
2,2
12

说明 #1

最小值为 0 ,其周围的值满足 9+1+1+1=12。

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq a_{ij} \leq 10^3$。

T4 机器人打靶游戏

何佬设计了一款机器人打靶游戏,已知机器人在第 $i$ 次打靶的时候,如果 $i$ 为完全平方数,中 10 环;如果 $i$ 为素数,中 9 环。除了以上两种情况外,如果 $i$ 为偶数,中 8 环;如果 $i$ 为奇数,中 7 环。

机器人在打靶的时候,总共打靶 $m$ 次,前 $n$ 次为试打靶,不计入总环数。现在请你求机器人打中的总环数。

为了避免有些乐子人搞事情,在 $n>m$ 的情况下,输出Error:n>m

如果一个数为某个整数的平方,那么这个数就是完全平方数。例如 9,16,25 等。

如果一个数为大于 1 的,因数只有 1 和其自身的,那么这个数就是素数,例如 2,3,5 等。

输入格式

两个正整数,总打靶次数 $m$ 和实验次数 $n$。

输出格式

一个非负整数,机器人打靶的总环数,或者报错Error:n>m

输入输出样例

输入 #1

1
6 3

输出 #1

1
27

说明 #1

前面三次是试验打靶,第四次为完全平方数,第五次为素数,第六次为偶数,共中 10+9+8=27 环。

输入 #2

1
3 6

输出 #2

1
Error:6>3

说明 #2

菜菜的晨曦当了一回乐子人。

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq n \leq 10^3,1 \leq m \leq 10^3$。

T5 在字符串里插入字符串!

定义一种字符串可以由长度和字符数据两部分表示:

1
2
3
4
typedef struct{
int length; // 字符串长度,0-99
char data[150]; // 字符数据,包括结束字符'\0'
} FIXED_STRING;

现在你需要编写一个函数 $insert$ 来把指定字符串 $t$ 插入到字符串 $s$ 的指定位置。

返回值是一个指向修改后字符串数据的地址。

参数:

$s$ :输入输出的参数,其中输入表示待修改字符串,输出表示修改后的字符串,长度 $lens$ 不超过 100 。

$t$ :待插入的字符串,长度 $lent$ 不超过 20。

$pos$ :表示插入位置(可以理解为字符数组的下标值),若 $pos$ 大于原字符串 $s$ 的长度,将 $t$ 直接连接到 $s$ 末尾。

本题限制

使用提交函数代码片段的形式进行。

提交的函数为以下函数。

1
char *insert(FIXED_STRING *s, char *t, int pos);

程序代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <string.h>

typedef struct {
int length; // 字符串长度,0-99
char data[150]; // 字符数据,包括结束字符'\0'
} FIXED_STRING;
char *insert(FIXED_STRING *s, char *t, int pos);
int main() {
FIXED_STRING s;
char t[20];
scanf("%s", s.data);
s.length = strlen(s.data);
scanf("%s", t);
int pos;
scanf("%d", &pos);
char *ps = insert(&s, t, pos);
printf("%d %s\n", s.length, ps);
return 0;
}

输入格式

第一行为源字符串 $s$ 。

第二行为待插入的字符串 $t$ 。

第三行为一个整数,插入的位置 $pos$ 。

输出格式

一行两个数据,第一个为一个整数,新字符串的长度,第二个为新字符串。中间用单个空格隔开。

输入输出样例

输入 #1

1
2
3
Xzhplayfootball!
andYhw
3

输出 #1

1
22 XzhandYhwplayfootball!

数据规模与约定

对于 100% 的数据,保证 $1 \leq lens \leq 100,1 \leq lent \leq 20,0 \leq pos \leq 200$ 。

场次四

感谢呃呃是我滴神的帮助!

T1 区间合并

你现在有 $n$ 个区间 $[a,b]$ ,你需要将重叠的区间进行合并。

规定区间中的 $a$ 和 $b$ 可以相等,例如 $[5,5]$ 也是一个区间。

对于任意两个区间,如果这两个区间有交集,那么我们就称这个区间是重叠的,并把他们的并集作为合并后的区间。

输入格式

第一行先输入 $n$ ,表示有 $n$ 个闭区间。

接下来的 $n$ 行,每行两个正整数,表示一个闭区间,每一对数之间用空格隔开,每输入完一对数字换行,一共输出 $n$ 组。

输出格式

第一行先输入合并之后的区间数。

随后输入合并之后的闭区间,并且按从小到大顺序输出,每输出一次换行。

输入输出样例

输入 #1

1
2
3
4
5
6
5
0 1
1 4
20 20
7 15
5 9

输出 #1

1
2
3
0 4
5 15
20 20

输入 #2

1
2
3
4
5
6
7
8
7
2 4
3 5
7 10
6 9
9 13
8 11
12 15

输出 #2

1
2
3
2
2 5
6 15

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq n \leq 100,1 \leq a \leq b \leq 10^3$。

T2 平滑滤波

对于一个有 $n$ 个元素的数组 $a_n$,我们可以用 $a_i$ 和其附近两个数 $a_{i-1},a_{i+1}$的平均数,平滑处理成 $n$ 个数据 $b_n$ 。

也就是说满足 $2 \leq i \leq i-1$ 时,$b_i$ 的值为 $\frac{a_{i-1}+a_i+a_{i+1}}{3}$ 。特别地,满足$b_1=b_2,b_{n-1}=b_n$。
现在你需要输出平滑处理后的数据。

输入格式

第一行输入 $n$,表示有 $n$ 个整数。
第二行输入 $n$ 个整数 $a_i$,用空格隔开。

输出格式

一行,输出处理后的 $n$ 个数 $b_n$ ,用空格隔开。

输入输出样例

输入 #1

1
2
5
1 2 3 4 5

输出 #1

1
2 2 3 4 4

数据规模与约定

  • 对于 100% 的数据,保证 $3 \leq n \leq 100,1 \leq a_i \leq 10^4$。

T3 有序序列插值

你现在需要给个 $n$ 个整数排序,从大到小,最后插入一个整数,不打乱大小顺序。

输入格式

第一行输入 $n$,表示有 $n$ 个整数。
第二行输入 $n$ 个整数 $a_i$,用空格隔开。
第三行输入要插入的整数 $t$ 。

输出格式

一行,输出排好顺序的整数列,用空格隔开。

输入输出样例

输入 #1

1
2
3
6
1 1 4 5 1 4
9

输出 #1

1
1 1 1 4 4 5 9

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq n \leq 100,1 \leq a_i , t \leq 10^4$。

T4 学生成绩处理

你现在要将 $x$ 名学生的 $y$ 门成绩处理。给每一位学生计算各科成绩的平均值(保留一位小数),再在每一列按从大到小的顺序给成绩排序(即按学科给成绩排序)。

输入格式

第一行,分别输入 $x$ 和 $y$ 。

接下来的 $x$ 行,每行输入 $y$ 个整数 $a_{ij}$,表示学生的成绩。

输出格式

前 $x$ 行,每行输出一个学生的平均成绩。

接下来的 $x$ 行,输出排列后的平均成绩。

输入输出样例

输入 #1

1
2
3
4
3
100 90 95
59 59 59
70 80 90

输出 #1

1
2
3
4
5
6
95
59
80
95
80
59

说明 #1

第二名学生得罪老师啦。

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq x \leq 100,1 \leq y \leq 10, 0 \leq a_{ij} \leq 100$。

T5 保留相应字符

你现在有长度 $len$ 不超过 100 的字符串 $a$ 和长度 $lenb$ 不超过 20 的字符串 $b$ ,将 $a$ 字符串中与 $b$ 字符串内含有的字符进行匹配,若相同则保留,其余删去。会要求是否区分大小写 ,0 表示不区分,1 表示区分。

对于字符串 $a$ ,我们采用结构体的管理方式:

1
2
3
4
typedef struct strings{
int len;\\表示长度
char data[100];\\存储字符内容
} FIXED_STRINGS;

现在要求输出处理后字符串的长度和字符串内容。

本题限制

使用提交函数代码片段的形式进行。

提交的函数为以下函数。

1
char *compress(char *FIXED_STRING,char *t,int ignore);\\t即为指向b字符串的指针

程序代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <string.h>

typedef struct {
int len;\\表示长度
char data[100];\\存储字符内容
}FIXED_STRING;

char *compress(char *FIXED_STRING,char *t,int ignore);

int main() {
FIXED_STRING a;
char b[20];
scanf("%s", a.data);
a.len = strlen(a.data);
scanf("%s", b);
int ignore;
scanf("%d", &ignore);
char *ps = compress(&a, b, ignore);
printf("%d\n%s", a.length, ps);
return 0;
}

输入格式

第一行为源字符串 $a$ 。

第二行为待匹配的字符串 $b$ 。

第三行为一个整数,是否区分大小写的标识,0 表示不区分,1 表示区分。

输出格式

第一个为一个整数,新字符串的长度。

第二行为新字符串。

输入输出样例

输入 #1

1
2
3
Hello World
eor
0

输出 #1

1
2
4
eoor

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq len \leq 100,1 \leq lenb \leq 20$ 。

场次五

本场次含拔尖、卓越、教改班等参加,难度较高。

T1 窗口点击

对于一个点,我们可以认为它可以用以下方式存储,通过坐标来进行存储:

1
2
3
4
typedef struct {
int x;//x坐标
int y;//y坐标
} POINT;

我们认为坐标原点在左上角,且 $x$ 轴方向朝右,$y$ 轴方向朝下。

对于一个窗口,我们可以认为它可以用以下方式存储,通过其 $id$ ,窗口左上角的点,窗口又下角的点,还有其层级来表示。窗口的层级值越小,代表其越在上层,也越容易被点击到。

1
2
3
4
5
6
typedef struct {
int id;//窗口id
POINT lp;//窗口左上角点
POINT rd;//窗口右下角点
int val;//窗口的层级
} WINDOWS;

现在你需要编写 $compress$ 函数,来输出一个点对应的点击窗口,如果这个点没有对应的窗口 ,输出 -1 。

本题限制

使用提交函数代码片段的形式进行。

提交的函数为以下函数。

1
int compress(WINDOWS windows[], int count, POINT *pt);

程序代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>

typedef struct {
int x;//x坐标
int y;//y坐标
} POINT;

typedef struct {
int id;//窗口id
POINT lp;//窗口左上角点
POINT rd;//窗口右下角点
int val;//窗口的层级
} WINDOWS;
int compress(WINDOWS windows[], int count, POINT *pt);

int main() {
int n, i;
WINDOWS windows[20];
POINT point;
scanf("%d %d %d", &n, &point.x, &point.y);
for (i = 0; i < n; i++) {
scanf("%d %d %d %d %d %d", &windows[i].id, &windows[i].lp.x, &windows[i].lp.y,
&windows[i].rd.x, &windows[i].rd.y, &windows[i].val);
}
int ans = compress(windows, n, &point);
printf("%d", ans);
return 0;
}

输入格式

第一行三个正整数,分别为窗口个数 $n$ ,点击点坐标 $x$ 和 $y$。

接下来 $n$ 行分别为窗口id,窗口左上角横坐标,窗口左上角纵坐标,窗扣右上角横坐标,窗口右上角纵坐标,还有窗口的层级 。

输出格式

一行,对应的点击窗口,如果没有输出 -1。

输入输出样例

输入 #1

1
2
3
4
3 15 15
1 5 5 10 10 1
2 5 5 15 15 3
3 10 10 15 15 2

输出 #1

1
3

输入 #2

1
2
3
4
3 114 514
1 5 5 10 10 1
2 5 5 15 15 3
3 10 10 15 15 2

输出 #2

1
-1

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq n \leq 20,1 \leq id,x,y,val \leq 10^3$。

T2 校验和

给出 $n$ 个数,计算这 $n$ 个数每一位的数位总和 $sum$ ,并输出 $sum$ 的个位数字作为检验结果。

输入格式

第一行一个正整数 $n$ ,为数的个数。

第二行为 $n$ 个正整数 $a_i$ 。

输出格式

一行,检验结果。

输入输出样例

输入 #1

1
2
2
114514 191981

输出 #1

1
5

说明 #1

1+1+4+5+1+4=16,1+9+1+9+8+1=29,(16+29)%10=5。

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq n \leq 100,1 \leq m \leq 10^5$。

T3 出现次数最多的数

给出 $n$ 个数,求出里面出现位置最多的数,并输出它。如果有多个数出现次数相同,输出靠左的那一个。

输入格式

第一行一个正整数 $n$ ,为数的个数。

第二行为 $n$ 个正整数 $a_i$ 。

输出格式

一行,出现次数最多的数。

输入输出样例

输入 #1

1
2
6
1 1 4 5 1 4

输出 #1

1
1

输入 #2

1
2
6
1 9 1 9 8 0

输出 #2

1
1

说明 #2

1 和 9 都出现了两次,由于 1 靠前,输出 1 。

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq n \leq 10^3,1 \leq m \leq 10^4$。

T4 古风排序

给出一个字符串,按照古代排版的形式(从右往左,从上往下打印字符串的形式)进行打印,其中每一列有 $n$ 个字符,多余的位置用空格补齐。且第一列不会全为空格。

输入格式

第一行一个正整数 $n$ ,为每一列的字符数。

第二行长度 $len$ 不超过 1000 的字符串。

输出格式

$n$ 行,打印的字符。

输入输出样例

输入 #1

1
2
4
Xzh like yuanyuan!

输出 #1

1
2
3
4
nn lX
!yyiz
uukh
aae

说明 #1

注意空格。

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq n \leq 100,1 \leq len \leq 10^3$。

T5 儒略历

你现在知道 2000 年 1 月 1 日是星期六。现在给你一个日期的年,月,日,求其是否合法。如果合法,输出其为星期几(若为星期一则输出 1 ,星期二则输出 2 ……星期天则输出 7 )。如果不合法,输出Error

对于一个日期,满足年份 $2000 \leq year \leq 5000$ ,月份 $1 \leq month \leq 12$ ,日期 $1 \leq day \leq 31$ 。

输入格式

第一行三个正整数 $year,month,day$ 。

输出格式

如果日期合法,输出星期的标识,否则输出Error

输入输出样例

输入 #1

1
2023 3 5

输出 #1

1
7

说明 #1

菜菜的晨曦在周日当天考了 C 语言,清晰地记得那天晚上熄了灯。

输入 #2

1
2023 2 29

输出 #2

1
Error

说明 #2

菜菜的晨曦宣布在 2023 年的 2 月的 29,30,31 这三天不打游戏。

数据规模与约定

  • 对于 100% 的数据,保证 $2000 \leq year \leq 5000 ,1 \leq month \leq 12,1 \leq day \leq 31$。

场次六

本场次为延迟场次。

T1 模式匹配

给出 $n$ 个数 $a_i$,统计其中连续数字段 3 5 7 出现的次数。

输入格式

第一行一个正整数 $n$ ,表示数的个数。

第二行给出 $n$ 个正整数。

输出格式

一个自然数,连续数字段 3 5 7 出现的次数。

输入输出样例

输入 #1

1
2
11
1 2 3 5 7 4 5 6 3 5 7

输出 #1

1
2

说明 #1

第 3-5 个数字和第 8-11 个数字是 3 5 7。

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq \leq 100 ,1 \leq a_i \leq 10^3$。

T2 最长的整数序列

给出 $n$ 个数 $a_i$,统计其中最长的连续出现的数的长度

对连续出现的数的长度给出如下定义: 如果一串数满足 $a_0\neq a_1=a_2=a_3=…=a_{n-1}=a_n \neq a_{n+1}$。那么连续出现的数的长度就为 $n$ 。

输入格式

第一行一个正整数 $n$ ,表示数的个数。

第二行给出 $n$ 个正整数。

输出格式

一个正整数,最长的连续出现的数的长度。

输入输出样例

输入 #1

1
2
8
4 2 2 3 3 3 3 5

输出 #1

1
4

说明 #1

最长的连续出现的数为 3 ,从第四个数到第七个数,长度为 4 。

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq n \leq 100 ,1 \leq a_i \leq 10^3$。

T3 矩阵的转置

给出一个 $m$ 行 $n$ 列的矩阵 $A_{m \times n}$ ,求出其转置矩阵 $B_{n \times m}$ 。并把转置后的矩阵填充元素 0 补成方阵,输出方阵主对角线的元素。

对转置作出以下定义:对于一个在 $i$ 行 $j$ 列的元素 $a_{ij}$ ,在经过转置后变成 $j$ 行 $i$ 列的元素 $b_{ji}$ 。

补充的方阵应该为 $k \times k$ 的矩阵,满足 $k$ 为 $m,n$ 中的较大值,即 $k=max(m,n)$ 。

对于一个方阵,满足其主对角线的元素从左上角到右下角,也就是元素集合 $a_{ii}$ 。

输入格式

第一行两个正整数 $m,n$ ,表示矩阵大小。

接下来 $m$ 行输入矩阵 $A$ ,元素之间用空格隔开。

输出格式

先输出转置矩阵 $B$ 。

接下来的一行内输出主对角线元素 $a_{ii}$ 。

所有的元素按照%-5d的格式输出。

输入输出样例

输入 #1

1
2
3
2 3
1 2 3
4 5 6

输出 #1

1
2
3
4
1    4
2 5
3 6
1 5 0

说明 #1

填充后的方阵应该如下:

1
2
3
1    4    0
2 5 0
3 6 0

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq m,n \leq 10 ,1 \leq a_{ij} \leq 10^3$。

T4 热搜霸榜

不可以,总司令!

许佬在大学生心理健康教育的课程发了一个帖子《总是忍不住想一个人该怎么办》,他获得了许许多多的回复!

给出 $n$ 个时刻,在第 $a_i$ 个时刻有一个回复,请问在 $d$ 的时间段内是否有 $k$ 个回复?

若有,输出YES n,否则输出NO n 。其中 $n$ 为时刻数。

定义时刻 $t$ 到时刻 $t+d$ 的时间段为 $d$ ,包含端点。

输入格式

第一行三个正整数 $n,d,k$ ,表示时刻数,时间段和回复数。

接下来输入 $n$ 个数,表示回复时间。

输出格式

判定后输出YES n,否则输出NO n 。其中 $n$ 为时刻数。

输入输出样例

输入 #1

1
2
5 3 3 
3 7 9 20 11

输出 #1

1
NO 5

输入 #2

1
2
5 3 3 
3 4 9 4 5

输出 #2

1
YES 5

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq m,k \leq 100 ,1 \leq a_i,d \leq 10^3$。

T5 除去相应字符

你现在有长度 $len$ 不超过 100 的字符串 $a$ 和长度 $lenb$ 不超过 20 的字符串 $b$ ,将 $a$ 字符串中与 $b$ 字符串内含有的字符进行匹配,若相同则删去,其余保留。会要求是否区分大小写 ,0 表示不区分,1 表示区分。

对于字符串 $a$ ,我们采用结构体的管理方式:

1
2
3
4
typedef struct strings{
int len;\\表示长度
char data[100];\\存储字符内容
} FIXED_STRINGS;

现在要求输出处理后字符串的长度和字符串内容。

本题限制

使用提交函数代码片段的形式进行。

提交的函数为以下函数。

1
char *compress(char *FIXED_STRING,char *t,int ignore);\\t即为指向b字符串的指针

程序代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <string.h>

typedef struct {
int len;\\表示长度
char data[100];\\存储字符内容
}FIXED_STRING;

char *compress(char *FIXED_STRING,char *t,int ignore);

int main() {
FIXED_STRING a;
char b[20];
scanf("%s", a.data);
a.len = strlen(a.data);
scanf("%s", b);
int ignore;
scanf("%d", &ignore);
char *ps = compress(&a, b, ignore);
printf("%d\n%s", a.length, ps);
return 0;
}

输入格式

第一行为源字符串 $a$ 。

第二行为待匹配的字符串 $b$ 。

第三行为一个整数,是否区分大小写的标识,0 表示不区分,1 表示区分。

输出格式

第一个为一个整数,新字符串的长度。

第二行为新字符串。

输入输出样例

输入 #1

1
2
3
Hello World
eor
0

输出 #1

1
2
4
Hll Wld

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq len \leq 100,1 \leq lenb \leq 20$ 。

场次七

本场次为补考场次。

感谢Estrellas的帮助!

T1 小云摘丝瓜

NOIP2005普及组

每年夏季,这个丝瓜啊就要成熟,但小云身高不够,所幸有一个 $40cm$ 高的凳子,现在要求输入瓜的个数 $n$ ,小云能够到的高度 $h$ (cm),各瓜的高度 $hi$ 和质量 $w_i$ ,求小云能够摘到瓜的个数和瓜的质量总和。

输入格式

第一行三个正整数 $n,h$ ,表示瓜的个数和小云能够到的高度。

接下来 $n$ 行分别输入两个正整数 $h_i,w_i$,分别表示各瓜的高度质量和。

输出格式

一行两个数字,用空格隔开,分别为小云小云能够摘到瓜的个数和瓜的质量总和。

输入输出样例

输入 #1

1
2
3
4
5
6
7
110 6
114 1
191 9
180 2
150 3
165 2
154 3

输出 #1

1
2 4

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq n \leq 100 ,1 \leq h_i \leq 10,120\leq h,h_i \leq 200$。

T2 相邻数对

给你 $n$ 个非负整数 $a_i$,找出两者仅相差 1 的数对数,保证数字不会相同

输出格式

一行两个数字,用空格隔开,分别为小云小云能够摘到瓜的个数和瓜的质量总和。

输入格式

第一行 1 个正整数 $n$ ,表示非负整数的个数。

接下来 $n$ 行输入 $n$ 个非负整数。

输出格式

一个数字,表示相差为 1 的数对数量。

输入 #1

1
2
6
1 4 5 9 8 2

输出 #1

1
3

说明 #1

表示有三组数对,分别为 $(1,2),(4,5),(8,9)$ 。

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq n \leq 100 ,0 \leq a_i \leq 10^3$。

T3 步行活动

某大学举办了一个锻炼身体的步行打卡,每个人有固定编号,在活动期间需要上传自己的编号,步数和日期等信息,这样学校就可以知道这些人参与活动的起止日期和总步数,并作出相应的统计。

输入格式

第一行 1 个正整数 $n$ ,表示存入数据的个数。

接下来 $n$ 行,分别输入他们的 5 位数字编号,步数 $a_i$ 和 YYYYMMDD 格式的日期,中间用空格隔开。

输出格式

按照编号从小到大的格式,在 $n$ 行内分别输出他们的编号,开始日期,结束日期和统计总步数,分别用空格隔开。

输入 #1

1
2
3
4
5
6
7
8
7
10001 1145 20230101
10003 1919 20230213
10002 1721 20230214
10004 1732 20230208
10002 810 20230207
10003 514 20230214
10004 2452 20230218

输出 #1

1
2
3
4
10001 20230101 20230101 1145
10002 20230207 20230214 2531
10003 20230213 20230214 2433
10004 20230208 20230218 4184

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq n \leq 100 ,0 \leq a_i \leq 10^4$。

T4 S形排序

给出一个 $m$ 行 $n$ 列的矩阵 $A_{m \times n}$ ,求将其元素按照从小到大的方式进行排列,并按蛇形的方式输出。

输入格式

第一行两个正整数 $m,n$ ,表示矩阵大小。

接下来 $m$ 行输入矩阵 $A$ ,元素之间用空格隔开 。

输出格式

输出排序后的矩阵,元素之间用空格隔开。

输入输出样例

输入 #1

1
2
3
4
3 3
3 4 9
1 5 7
2 8 6

输出 #1

1
2
3
1 2 3
6 5 4
7 8 9

数据规模与约定

  • 对于 100% 的数据,保证 $1 \leq m,n \leq 10 ,1 \leq a_{ij} \leq 10^3$。

T5 近似平方数

施工遗迹,若给你带来不便,请谅解。

RP++ 题

做了考满分!

伟大的xzh奆佬向人们降下了他的祝福

stoxzhorz

现在快要期末考试了,我知道 C语言 大家都没有复习好。但是 伟大的xzh 复习好了!他决定花费人生中宝贵的 30min 来 AK 期末 C语言,然后潇洒地交卷去远望谷玩。将这道题转发给 5 个群聊,你就能获得 xzh 的祝福,让你 C语言 rp++!我试过,是真的,期中我转发了 xzh ,我一个没怎么学过 C语言 的差生都全做出来 了。所以让我们转发 xzh,膜拜 xzh 吧!

输入格式

本题无输入。

输出格式

输出 stO xzh Orz 来膜拜 xzh,让自己 rp++ 吧!

提示

考前膜拜 xzh,会获得 xzh 大神的祝福哦!