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

你不会是要准备C语言期末考试吧(

晨曦今天清理电脑的时候发现了这个挂了 114514 小时的博客,并发现了唯一?有价值的博客帖子(

于是抽出了宝贵的19.19分钟来更新这个博客,删去了大部分废话(

现在的晨曦已经忙于考研了(悲)不要学鼠鼠摆烂啊~

指北

我当时看的资料,以及xdx看的资料(

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

西电23-24C语言期末考试题库

综合报告

题目来源

主要靠当时的手动记忆,由于目前题库包含了部分当期考试的题,因此你可以直接找原题练习。
以及往年题大部分还是知识点参考,真不如洛谷吧(

悲报

最新的悲报

考研要寄掉啦!

过时的悲报

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

声明

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

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

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

某个闲批曾经开了个大概 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的字符串压缩指向性很明显),也意味着你不会相关的知识点就做不出来,对语言的掌握要求有所提高。

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

突发事故

考试情况中出现过服务器崩溃导致考试延期,或者本场考试评测中断,需要通过学生邮箱进行代码提交的情况,直接从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命令。适合各种沙雕错误的检测。目前 C 语言应该还是使用 C99 标准, C++ 使用 C++11 标准。
  • 善用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 近似平方数

这道题一直没补上去,反正大概应该是找离一个数最近的平方数这个样子。

如果我记错了也别打我,聊天记录都不在了