东油秦“代码织锦,智启星河”编程竞逐赛
活动背景
在数字浪潮奔涌的时代,代码是编织未来的丝线,算法是叩击真理的密钥。为激发本校学子探索计算机科学的热情,提升逻辑思维与实践能力,东北石油大学秦皇岛校区大数据与计算机科学系特此举办编程竞赛,以赛促学、以技会友,于代码的方寸之间,窥见浩瀚星河。
主办单位
东北石油大学秦皇岛校区大数据与计算机科学系系学生会
比赛内容
赛制:采用 IOI 赛制,即赛时反馈,按测试点或子任务得分。 评分规则:比赛结束后按总得分及总用时进行排名(罚时制)。 题目详情:8 道编程题,难度梯度递增,覆盖基础语法、简单算法与递归搜索,整体难度介于课后习题与力扣周赛之间。
赛后总结
本次比赛圆满结束,在此向所有获奖选手致以最热烈的祝贺。你们用代码编织逻辑之美,以算法突破思维边界,这份荣誉既是天赋与热爱的馈赠,更是无数深夜调试代码、反复优化方案的汗水结晶,让智慧的火花得以璀璨绽放。 期待未来见证更多同学"以创新精神书写数字时代的新篇章"!代码永无止境,少年未来可期!
封榜时刻

题目列表及解题思路
1. P1425 小鱼的游泳时间
题目描述
伦敦奥运会要到了,小鱼在拼命练习游泳准备参加游泳比赛,可怜的小鱼并不知道鱼类是不能参加人类的奥运会的。
这一天,小鱼给自己的游泳时间做了精确的计时(本题中的计时都按 $24$ 小时制计算),它发现自己从 $a$ 时 $b$ 分一直游泳到当天的 $c$ 时 $d$ 分,请你帮小鱼计算一下,它这天一共游了多少时间呢?
小鱼游的好辛苦呀,你可不要算错了哦。
输入格式
一行内输入四个整数,以空格隔开,分别表示题目中的 $a, b, c, d$。
输出格式
一行内输出两个整数 $e$ 和 $f$,用空格间隔,依次表示小鱼这天一共游了多少小时多少分钟。其中表示分钟的整数 $f$ 应该小于 $60$。
输入输出样例 #1
输入 #1
12 50 19 10输出 #1
6 20说明/提示
对于全部测试数据,$0\le a,c \le 24$,$0\le b,d \le 60$,且结束时间一定晚于开始时间。
解题思路
#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
100输出 #1
001输入输出样例 #2
输入 #2
001输出 #2
100输入输出样例 #3
输入 #3
678输出 #3
876解题思路
#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
2输出 #1
3输入输出样例 #2
输入 #2
4输出 #2
15说明/提示
样例解释
样例 $1$
$2$ 层的圣诞树只需 $3$ 段绳⼦。
样例 $2$
参考题图。
数据规模
所有数据满足 $1 ≤ n ≤ 10^3$。
本题原始满分为 $15\text{pts}$。
解题思路
#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
5
9 5 6 8 9输出 #1
7.67说明/提示
数据保证,$3 \leq n \leq 1000$,每个评委打出的分值为为 $0$ 到 $10$(含 $0$ 与 $10$)之间的整数。
解题思路
#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
abcdedcba输出 #1
yes解题思路
#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 5 3
ABC输出 #1
1 3 5输入输出样例 #2
输入 #2
6 4 2
CAB输出 #2
6 2 4解题思路
#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
3
13 312 343输出 #1
34331213输入输出样例 #2
输入 #2
4
7 13 4 246输出 #2
7424613说明/提示
对于全部的测试点,保证 $1 \leq n \leq 20$,$1 \leq a_i \leq 10^9$。
NOIP1998 提高组 第二题
解题思路
#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
31 16输出 #1
1F说明/提示
样例解释。
将十进制 $31$ 转化为十六进制数。
解题思路
#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;
}