该比赛圆满结束,比赛页面详见 东油秦“代码织锦,智启星河”编程竞逐赛 比赛邀请码:yxal

活动背景

在数字浪潮奔涌的时代,代码是编织未来的丝线,算法是叩击真理的密钥。为激发本校学子探索计算机科学的热情,提升逻辑思维与实践能力,东北石油大学秦皇岛校区大数据与计算机科学系特此举办编程竞赛,以赛促学、以技会友,于代码的方寸之间,窥见浩瀚星河。

主办单位

东北石油大学秦皇岛校区大数据与计算机科学系系学生会

比赛内容

赛制:采用IOI赛制,即赛时反馈,按测试点或子任务得分。
评分规则:比赛结束后按总得分及总用时进行排名(罚时制)。
题目详情:8道编程题,难度梯度递增,覆盖基础语法、简单算法与递归搜索,整体难度介于课后习题与力扣周赛之间。

赛后总结

本次比赛圆满结束,在此向所有获奖选手致以最热烈的祝贺。你们用代码编织逻辑之美,以算法突破思维边界,这份荣誉既是天赋与热爱的馈赠,更是无数深夜调试代码、反复优化方案的汗水结晶,让智慧的火花得以璀璨绽放。
期待未来见证更多同学"以创新精神书写数字时代的新篇章"!代码永无止境,少年未来可期!

封榜时刻

因带宽限制,图片加载较慢,请耐心等待。

题目列表及解题思路

1. P1425 小鱼的游泳时间

题目描述

伦敦奥运会要到了,小鱼在拼命练习游泳准备参加游泳比赛,可怜的小鱼并不知道鱼类是不能参加人类的奥运会的。

这一天,小鱼给自己的游泳时间做了精确的计时(本题中的计时都按 $24$ 小时制计算),它发现自己从 $a$ 时 $b$ 分一直游泳到当天的 $c$ 时 $d$ 分,请你帮小鱼计算一下,它这天一共游了多少时间呢?

小鱼游的好辛苦呀,你可不要算错了哦。

输入格式

一行内输入四个整数,以空格隔开,分别表示题目中的 $a, b, c, d$。

输出格式

一行内输出两个整数 $e$ 和 $f$,用空格间隔,依次表示小鱼这天一共游了多少小时多少分钟。其中表示分钟的整数 $f$ 应该小于 $60$。

输入输出样例 #1

输入 #1

1
12 50 19 10

输出 #1

1
6 20

说明/提示

对于全部测试数据,$0\le a,c \le 24$,$0\le b,d \le 60$,且结束时间一定晚于开始时间。

解题思路

1
2
3
4
5
6
7
8
9
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, c, d, s;
cin >> a >> b >> c >> d;
s = c * 60 + d - (a * 60 + b);
cout << s / 60 << " " << s % 60 << endl;
return 0;
}

2. B2028 反向输出一个三位数

题目描述

将一个三位数反向输出,例如输入 $358$,反向输出 $853$。

输入格式

一个三位数 $n$。

输出格式

反向输出 $n$。

输入输出样例 #1

输入 #1

1
100

输出 #1

1
001

输入输出样例 #2

输入 #2

1
001

输出 #2

1
100

输入输出样例 #3

输入 #3

1
678

输出 #3

1
876

解题思路

1
2
3
4
5
6
7
8
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
cout << n % 10 << n % 100 / 10 << n / 100 << endl;
return 0;
}

3. B3735 [信息与未来 2018] 圣诞树

题目描述

圣诞树共有 $n$ 层,从上向下数第 $1$ 层有 $1$ 个星星、第 $2$ 层有 $2$ 个星星、以此类推,排列成下图所示的形状。

星星和星星之间用绳子连接。第 $1,2,\cdots, n - 1$ 层的每个星星都向下一层最近的两个星星连一段绳子,最后一层的相邻星星之间连一段绳子。

你能算出如果要布置一棵很大($n$ 层)的圣诞树,需要买多少段绳子吗?

输入格式

输入一行一个整数 $n$,圣诞树的层数。

输出格式

输出一行一个整数,代表圣诞树中绳子的段数。

输入输出样例 #1

输入 #1

1
2

输出 #1

1
3

输入输出样例 #2

输入 #2

1
4

输出 #2

1
15

说明/提示

样例解释

样例 $1$

$2$ 层的圣诞树只需 $3$ 段绳⼦。

样例 $2$

参考题图。

数据规模

所有数据满足 $1 ≤ n ≤ 10^3$。

本题原始满分为 $15\text{pts}$。

解题思路

1
2
3
4
5
6
7
8
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
cout << n * n - 1 << endl;
return 0;
}

4. P5726 【深基4.习9】打分

题目描述

现在有 $n(n \le 1000)$ 位评委给选手打分,分值从 $0$ 到 $10$。需要去掉一个最高分,去掉一个最低分(如果有多个最高或者最低分,也只需要去掉一个),剩下的评分的平均数就是这位选手的得分。现在输入评委人数和他们的打分,请输出选手的最后得分,精确到 $2$ 位小数。

输入格式

第一行输入一个正整数 $n$,表示有 $n$ 个评委。

第二行输入 $n$ 个正整数,第 $i$ 个正整数表示第 $i$ 个评委打出的分值。

输出格式

输出一行一个两位小数,表示选手的最后得分。

输入输出样例 #1

输入 #1

1
2
5
9 5 6 8 9

输出 #1

1
7.67

说明/提示

数据保证,$3 \leq n \leq 1000$,每个评委打出的分值为为 $0$ 到 $10$(含 $0$ 与 $10$)之间的整数。

解题思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<double> s(n);
for (auto& i : s) cin >> i;

sort(s.begin(), s.end());
double sum = accumulate(s.begin() + 1, s.end() - 1, 0.0);

printf("%.2f", sum / (n - 2));
}

5. B2124 判断字符串是否为回文

题目描述

输入一个字符串,输出该字符串是否回文。回文是指顺读和倒读都一样的字符串。

输入格式

输入一行字符串,长度小于 $100$。

输出格式

如果字符串是回文,输出 yes;否则,输出 no

输入输出样例 #1

输入 #1

1
abcdedcba

输出 #1

1
yes

解题思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <bits/stdc++.h>
using namespace std;
bool isHuiwen(string s) {
int n = s.length();
for (int i = 0; i < n / 2; i++) {
if (s[i] != s[n - 1 - i]) {
return false;
}
}
return true;
}
int main() {
string s;
cin >> s;
cout << (isHuiwen(s) ? "yes" : "no");
return 0;
}

6. P4414 [COCI 2006/2007 #2] ABC

题目描述

三个整数分别为 $A,B,C$。这三个数字不会按照这样的顺序给你,但它们始终满足条件:$A < B < C$。为了看起来更加简洁明了,我们希望你可以按照给定的顺序重新排列它们。

输入格式

第一行包含三个正整数 $A,B,C$,不一定是按这个顺序。这三个数字都小于或等于 $100$。第二行包含三个大写字母 $A$、$B$ 和 $C$(它们之间没有空格)表示所需的顺序。

输出格式

在一行中输出 $A$,$B$ 和 $C$,用一个 (空格)隔开。

感谢 @smartzzh 提供的翻译

输入输出样例 #1

输入 #1

1
2
1 5 3
ABC

输出 #1

1
1 3 5

输入输出样例 #2

输入 #2

1
2
6 4 2
CAB

输出 #2

1
6 2 4

解题思路

1
2
3
4
5
6
7
8
9
10
11
#include <bits/stdc++.h>
using namespace std;
int a[3];
char X, Y, Z;
int main() {
cin >> a[0] >> a[1] >> a[2];
cin >> X >> Y >> Z;
sort(a, a + 3);
cout << a[X - 'A'] << " " << a[Y - 'A'] << " " << a[Z - 'A'];
return 0;
}

7. P1012 [NOIP 1998 提高组] 拼数

题目描述

设有 $n$ 个正整数 $a_1 \dots a_n$,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。

输入格式

第一行有一个整数,表示数字个数 $n$。

第二行有 $n$ 个整数,表示给出的 $n$ 个整数 $a_i$。

输出格式

一个正整数,表示最大的整数

输入输出样例 #1

输入 #1

1
2
3
13 312 343

输出 #1

1
34331213

输入输出样例 #2

输入 #2

1
2
4
7 13 4 246

输出 #2

1
7424613

说明/提示

对于全部的测试点,保证 $1 \leq n \leq 20$,$1 \leq a_i \leq 10^9$。

NOIP1998 提高组 第二题

解题思路

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<string> nums(n);
for (auto& i : nums) cin >> i;
sort(nums.begin(), nums.end(), [](const string& a, const string& b) {
return a + b > b + a;
});
string res = accumulate(nums.begin(), nums.end(), string());
cout << (res.empty() || res[0] == '0' ? "0" : res) << endl;
}

8. B2143 进制转换

题目描述

用递归算法将一个十进制整数 $X$($1 \le X \le 10^9$)转换成任意进制数 $M$($2\le M\le16$,$M$ 为整数)。

输入格式

一行两个数,第一个十进制整数 $X$,第二个为进制 $M$。

输出格式

输出结果。

输入输出样例 #1

输入 #1

1
31 16

输出 #1

1
1F

说明/提示

样例解释

将十进制 $31$ 转化为十六进制数。

解题思路

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
#include <iostream>
using namespace std;
void dfs(int n, int m) {
if (n == 0) return;
dfs(n / m, m);
int r = n % m;
char c;
if (r < 10) {
c = '0' + r;
}
else {
c = 'A' + (r - 10);
}
cout << c;
}
int main() {
int X, M;
cin >> X >> M;
if (X == 0) {
cout << "0";
}
else {
dfs(X, M);
}
return 0;
}

致谢

感谢活动平台支持:洛谷