# 东油秦“代码织锦，智启星河”编程竞逐赛


{{< note info flat >}}
该比赛圆满结束，比赛页面详见 [东油秦“代码织锦，智启星河”编程竞逐赛](https://www.luogu.com.cn/contest/238293) 比赛邀请码：yxal
{{< /note >}}

# 活动背景

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

# 主办单位

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

# 比赛内容

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

# 赛后总结

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

## 封榜时刻

![](https://file.y1xuanyun.cn/img/active/NEPU_QHD_codeP1.png)
{{< note info flat >}}
因带宽限制，图片加载较慢，请耐心等待。
{{< /note >}}

# 题目列表及解题思路

# 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$，且结束时间一定晚于开始时间。

## 解题思路

```C++
#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
```

## 解题思路

```C++
#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$ 个星星、以此类推，排列成下图所示的形状。

![](https://cdn.luogu.com.cn/upload/image_hosting/gnp9d7er.png)

星星和星星之间用绳子连接。第 $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}$。

## 解题思路

```C++
#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$）之间的整数。

## 解题思路

```C++
#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
```

## 解题思路

```C++
#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
```

## 解题思路

```C++
#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 提高组 第二题

## 解题思路

```C++
#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$ 转化为十六进制数。

## 解题思路

```C++
#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;
}

```

# 致谢

{{< note default flat >}}
感谢活动平台支持：[洛谷](https://www.luogu.com.cn/)
{{< /note >}}

