综述由AI生成提供了 2025 年团体程序设计天梯赛 L1 至 L2 部分的 C++ 题解。涵盖珍惜生命、偷感好重、高温补贴、零头就抹了吧、字符串评分、序列操作、大幂数判断、现代战争模拟、算式拆分、三点共线、胖达山头调度及被 n 整除的 n 位数等题目。包含输入输出格式说明、样例分析及完整 C++ 代码实现,旨在帮助参赛者理解解题思路与代码逻辑。
SqlMaster29 浏览
L1-1 珍惜生命
前辈工程师 Martin Golding 教育我们说:'Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.'(写代码的时候,总是要把维护你代码的那个家伙想象成一个有暴力倾向的精神病,他还知道你住哪儿)。本题就请你直接在屏幕上输出这句话。
输入格式:
本题没有输入。
输出格式:
在一行中输出 Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.。
输入样例:
无
输出样例:
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.
参考代码
#include<bits/stdc++.h>usingnamespace std;
intmain(){
cout << "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.";
}
根据输入情况,如果可以获得高温补贴,则在一行中输出 Bu Tie(补贴),第二行输出 T 的值;否则输出不补贴的原因:如果室内外温度都超标,仅仅是因为室内工作就不补贴,则输出 Shi Nei(室内),第二行输出 T 的值;如果在室外工作但天气不热、或工作场所温度不高,则输出 Bu Re(不热),第二行输出 t 的值;如果天气不热、或工作场所温度不高,且在室内工作,则输出 Shu Shi(舒适),第二行输出 t 的值。
输入样例 1:
36 1 33
输出样例 1:
Bu Tie 36
输入样例 2:
36 0 33
输出样例 2:
Shi Nei 36
输入样例 3:
36 1 27
输出样例 3:
Bu Re27
输入样例 4:
36 0 24
输出样例 4:
Shu Shi 24
参考代码
#include<bits/stdc++.h>usingnamespace std;
intmain(){
int T, S, t;
cin >> T >> S >> t;
if (S == 1) {
if (T > 35 && t >= 33) cout << "Bu Tie" << endl << T;
else cout << "Bu Re" << endl << t;
} else {
if (T > 35 && t >= 33) cout << "Shi Nei" << endl << T;
else cout << "Shu Shi" << endl << t;
}
}
#include<bits/stdc++.h>usingnamespace std;
int w[123];
intmain(){
map<char, int> h;
string s;
cin >> s;
for (int i = 'a'; i <= 'z'; i++) cin >> w[i];
int ans = 0;
for (int i = 0; i < s.size(); i++) {
h[s[i]]++;
ans += w[s[i]];
}
for (int i = 'a'; i <= 'z'; i++) {
cout << h[i];
if (i != 'z') cout << " ";
else cout << endl;
}
cout << ans;
}
输入第一行是两个正整数 N,M (1≤N,M≤10^3),分别表示正整数个数以及操作次数。
接下来的一行有 N 个用一个空格隔开的正整数 Ai (1≤Ai≤26),表示需要进行操作的原始数字序列。
紧接着有 M 部分,每一部分表示一次操作,你需要按照输入顺序依次执行这些操作。记 L 为当前操作序列长度(注意原始序列在经过数次操作后,其长度可能不再是 N)。每部分的格式与约定如下:
其中 k 是所有幂次和中最大的幂次。如果解不存在,则在一行中输出 Impossible for n.,其中 n 是输入的 n 的值。
输入样例 1:
91
输出样例 1:
1^2+2^2+3^2+4^2+5^2+6^2
输入样例 2:
2147483647
输出样例 2:
Impossible for 2147483647.
参考代码
#include<bits/stdc++.h>usingnamespace std;
int a[100100];
longlong n, t, s, w;
intmain(){
cin >> n;
for (int i = 1; i <= n; i++) {
s += i;
if (s >= n) {
t = i;
break;
}
}
for (int i = 1; i <= t; i++) a[i] = i;
for (int i = 31; i >= 1; i--) {
w = 0;
for (int j = 1; j <= t; j++) {
w += pow(a[j], i);
if (w == n) {
for (int k = 1; k <= j; k++) {
cout << k << "^" << i;
if (k != j) cout << "+";
else cout << endl;
}
return0;
} elseif (w > n) break;
}
}
cout << "Impossible for " << n << "." << endl;
}
L1-8 现代战争
在最新的《命运召唤:现代战争》中,你要扮演 B 国的一名战斗机飞行员,前往轰炸 A 国的高价值建筑。A 国的建筑群可视为一个由 n×m 个小方格组成的地图,每个小方格中有一幢建筑,并且你已经知道了所有建筑的价值。
作为一名优秀的战斗机飞行员,你打算轰炸 k 幢建筑,轰炸方式是:你选择当前所有还存在的建筑里最高价值的一幢投下炸弹,这个炸弹会将这个建筑所在的一整行和一整列都炸平。。随后系统将彻底抹除被炸平的建筑,将剩下的地块合并成 (n−1)×(m−1) 的地图。
例如对原始地图
1 2 3 7 9 8 6 5 4
进行一次轰炸后,更新后的地图为:
1 3 6 4
请你编写程序,输出你轰炸了 k 幢建筑后的地图。
注:游戏纯属虚构,如有雷同纯属巧合
输入格式:
输入第一行给出三个正整数 n、m(2≤n,m≤1000)和 k(<min{n,m}),依次对应地图中建筑的行数、列数,以及轰炸步数。随后 n 行,每行 m 个整数,为地图中对应建筑的价值。
题目保证所有元素在 [-2^30,2^30] 区间内,且互不相等。同行数字间以空格分隔。
#include<bits/stdc++.h>usingnamespace std;
int x[1010], y[1010];
int a[1010][1010];
priority_queue<array<int, 3>> p;
intmain(){
int n, m, k;
cin >> n >> m >> k;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
p.push({a[i][j], i, j});
}
while (k--) {
auto q = p.top();
while (x[q[1]] || y[q[2]]) {
p.pop();
q = p.top();
}
x[q[1]] = y[q[2]] = 1;
}
for (int i = 1; i <= n; i++) {
if (x[i]) continue;
int o = 0;
for (int j = 1; j <= m; j++) {
if (y[j]) continue;
if (o == 0) {
cout << a[i][j];
o = 1;
} else cout << " " << a[i][j];
}
cout << endl;
}
}
输入在一行中给出 3 个正整数:n(1<n≤15),以及闭区间端点 a 和 b(1≤a≤b<10^15)。
输出格式:
按递增序输出区间 [a,b] 内被 n 整除的 n 位数,每个数字占一行。
若给定区间内没有解,则输出 No Solution。
输入样例 1:
5 34200 34500
输出样例 1:
34200 34205 34240 34245 34280 34285
输入样例 2:
41040 1050
输出样例 2:
NoSolution
参考代码
#include<bits/stdc++.h>usingnamespace std;
longlong n, l, r;
bool flag = 1;
voiddfs(longlong x, int d){
if (d == n + 1) {
if (x <= r && x >= l) {
flag = 0;
cout << x << endl;
}
return;
}
for (int i = 0; i <= 9; i++) {
if (d == 1 && i == 0) continue;
longlong t = x * 10 + i;
if (t % d == 0) dfs(t, d + 1);
}
}
intmain(){
cin >> n >> l >> r;
dfs(0, 1);
if (flag) cout << "No Solution" << endl;
}