赞
踩
#include<bits/stdc++.h>
using namespace std;
int main() {
puts("Good code is its own best documentation.");
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int a, b;
int main() {
cin >> a >> b, a += b;
cout << a - 16 << endl << a - 3 << endl << a - 1 << endl << a;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n, m, k;
string x;
int main() {
cin >> n >> x >> m >> k;
if(k == n) cout << "mei you mai " << x << " de";
else if(k == m) cout << "kan dao le mai " << x << " de";
else cout << "wang le zhao mai " << x << " de";
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n, a, b, c;
int main() {
cin >> n;
while(n--) {
cin >> a >> b >> c;
if(c == a * b) puts("Lv Yan");
else if (c == a + b) puts("Tu Dou");
else puts("zhe du shi sha ya!");
}
return 0;
}
#include<bits/stdc++.h> using namespace std; int n, k, x; int main() { cin >> n; vector<int> a(n); for(int i = 0; i < n; ++i) { cin >> a[i]; } cin >> k; while(k--) { int cnt = 0, wa = 0; for(int i = 0; i < n; ++i) { cin >> x; if(!x) continue; ++cnt; if(x != a[i]) ++wa; } if(cnt && !wa) puts("Da Jiang!!!"); else puts("Ai Ya"); } return 0; }
#include<bits/stdc++.h> using namespace std; string s, s1, s2, s3; int n, a, b; int main() { cin >> s >> n; while(n--) { cin >> a >> b >> s1 >> s2; s3 = s.substr(a - 1, b - a + 1); s.erase(s.begin() + a - 1, s.begin() + b); int len = s1.length(); s1 += s2; int pos = s.find(s1); if(pos != s.npos) s.insert(pos + len, s3); else s.insert(s.length(), s3); } cout << s; return 0; }
#include<bits/stdc++.h> using namespace std; int n0, n1, n, flag0, flag1, res = INT_MAX; vector<int> N0, N1; int main() { cin >> n0 >> n1 >> n; for(int i = 2; i <= min(n0, n1); ++i) { if(!(n0 % i)) N0.emplace_back(i); if(!(n1 % i)) N1.emplace_back(i); } for(int i = 0; i < N0.size(); ++i) { for(int j = 0; j < N1.size(); ++j) { if(n0 / N0[i] + n1 / N1[j] == n && fabs(N0[i] - N1[j]) < res) { res = fabs(N0[i] - N1[j]), flag0 = n0 / N0[i], flag1 = n1 / N1[j]; } } } if(res == INT_MAX) puts("No Solution"); else cout << flag0 << " " << flag1; return 0; }
#include<bits/stdc++.h> using namespace std; long long n, na, nb, sa, sb; long long sum(long long x) { long long cnt = 0; while(x) { cnt += (x % 10), x /= 10; } return cnt; } int main() { cin >> n; while(n--) { cin >> na >> nb, sa = sum(na), sb = sum(nb); if(!(na % sb) && !(nb % sa) || na % sb && nb % sa) cout << (na < nb ? "B\n" : "A\n"); else if(!(na % sb)) cout << "A\n"; else cout << "B\n"; } return 0; }
L2-045 堆宝塔
堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小,按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下:
首先准备两根柱子,一根 A 柱串宝塔,一根 B 柱用于临时叠放。
把第 1 块彩虹圈作为第 1 座宝塔的基座,在 A 柱放好。
将抓到的下一块彩虹圈 C 跟当前 A 柱宝塔最上面的彩虹圈比一下,如果比最上面的小,就直接放上去;否则把 C 跟 B 柱最上面的彩虹圈比一下:
如果 B 柱是空的、或者 C 大,就在 B 柱上放好;
否则把 A 柱上串好的宝塔取下来作为一件成品;然后把 B 柱上所有比 C 大的彩虹圈逐一取下放到 A 柱上,最后把 C 也放到 A 柱上。
重复此步骤,直到所有的彩虹圈都被抓完。最后 A 柱上剩下的宝塔作为一件成品,B 柱上剩下的彩虹圈被逐一取下,堆成另一座宝塔。问:宝宝一共堆出了几个宝塔?最高的宝塔有多少层?
输入格式:
输入第一行给出一个正整数 N(≤103),为彩虹圈的个数。第二行按照宝宝抓取的顺序给出 N 个不超过 100 的正整数,对应每个彩虹圈的直径。
输出格式:
在一行中输出宝宝堆出的宝塔个数,和最高的宝塔的层数。数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
11
10 8 9 5 12 11 4 3 1 9 15
输出样例:
4 5
样例解释:
宝宝堆成的宝塔顺次为:
10、8、5
12、11、4、3、1
9
15、9
#include<bits/stdc++.h> using namespace std; int n, c, cnt, maxx; stack<int> a, b; int main() { cin >> n >> c; a.emplace(c); for(int i = 1; i < n; ++i) { cin >> c; if(c < a.top()) a.emplace(c); else if(b.empty() || c > b.top()) b.emplace(c); else { ++cnt, maxx = max(maxx, (int)a.size()); while(!a.empty()) a.pop(); while(!b.empty() && b.top() > c) a.emplace(b.top()), b.pop(); a.emplace(c); } } ++cnt, maxx = max(maxx, (int)a.size()); if(!b.empty()) ++cnt, maxx = max(maxx, (int)b.size()); cout << cnt << " " << maxx; return 0; }
L2-046 天梯赛的赛场安排
天梯赛使用 OMS 监考系统,需要将参赛队员安排到系统中的虚拟赛场里,并为每个赛场分配一位监考老师。每位监考老师需要联系自己赛场内队员对应的教练们,以便发放比赛账号。为了尽可能减少教练和监考的沟通负担,我们要求赛场的安排满足以下条件:
每位监考老师负责的赛场里,队员人数不得超过赛场规定容量 C;
每位教练需要联系的监考人数尽可能少 —— 这里假设每所参赛学校只有一位负责联系的教练,且每个赛场的监考老师都不相同。
为此我们设计了多轮次排座算法,按照尚未安排赛场的队员人数从大到小的顺序,每一轮对当前未安排的人数最多的学校进行处理。记当前待处理的学校未安排人数为 n:
如果 n≥C,则新开一个赛场,将 C 位队员安排进去。剩下的人继续按人数规模排队,等待下一轮处理;
如果 n<C,则寻找剩余空位数大于等于 n 的编号最小的赛场,将队员安排进去;
如果 n<C,且找不到任何非空的、剩余空位数大于等于 n 的赛场了,则新开一个赛场,将队员安排进去。
由于近年来天梯赛的参赛人数快速增长,2023年超过了 480 所学校 1.6 万人,所以我们必须写个程序来处理赛场安排问题。
输入格式:
输入第一行给出两个正整数 N 和 C,分别为参赛学校数量和每个赛场的规定容量,其中 0<N≤5000,10≤C≤50。随后 N 行,每行给出一个学校的缩写(为长度不超过 6 的非空小写英文字母串)和该校参赛人数(不超过 500 的正整数),其间以空格分隔。题目保证每所学校只有一条记录。
输出格式:
按照输入的顺序,对每一所参赛高校,在一行中输出学校缩写和该校需要联系的监考人数,其间以 1 空格分隔。
最后在一行中输出系统中应该开设多少个赛场。
输入样例:
10 30
zju 30
hdu 93
pku 39
hbu 42
sjtu 21
abdu 10
xjtu 36
nnu 15
hnu 168
hsnu 20
输出样例:
zju 1
hdu 4
pku 2
hbu 2
sjtu 1
abdu 1
xjtu 2
nnu 1
hnu 6
hsnu 1
16
#include<bits/stdc++.h> using namespace std; int n, c, res, cnt, a[5005], x; string s; priority_queue<int> Q; int main() { cin >> n >> c; while(n--) { cin >> s >> x; cout << s << " " << ceil(1.0 * x / c) << endl; res += (x / c); if(x % c) Q.emplace(x % c); } while(!Q.empty()) { x = Q.top(), Q.pop(); bool flag = true; for(int i = 0; i < cnt; ++i) { if(a[i] + x <= c) { a[i] += x, flag = false; break; } } if(flag) a[cnt++] = x; } cout << cnt + res; return 0; }
L2-047 锦标赛
有 2k 名选手将要参加一场锦标赛。锦标赛共有 k 轮,其中第 i 轮的比赛共有 2k−i 场,每场比赛恰有两名选手参加并从中产生一名胜者。每场比赛的安排如下:
对于第 1 轮的第 j 场比赛,由第 (2j−1) 名选手对抗第 2j 名选手。
对于第 i 轮的第 j 场比赛(i>1),由第 (i−1) 轮第 (2j−1) 场比赛的胜者对抗第 (i−1) 轮第 2j 场比赛的胜者。
第 k 轮唯一一场比赛的胜者就是整个锦标赛的最终胜者。
举个例子,假如共有 8 名选手参加锦标赛,则比赛的安排如下:
第 1 轮共 4 场比赛:选手 1 vs 选手 2,选手 3 vs 选手 4,选手 5 vs 选手 6,选手 7 vs 选手 8。
第 2 轮共 2 场比赛:第 1 轮第 1 场的胜者 vs 第 1 轮第 2 场的胜者,第 1 轮第 3 场的胜者 vs 第 1 轮第 4 场的胜者。
第 3 轮共 1 场比赛:第 2 轮第 1 场的胜者 vs 第 2 轮第 2 场的胜者。
已知每一名选手都有一个能力值,其中第 i 名选手的能力值为 ai。在一场比赛中,若两名选手的能力值不同,则能力值较大的选手一定会打败能力值较小的选手;若两名选手的能力值相同,则两名选手都有可能成为胜者。
令 li,j 表示第 i 轮第 j 场比赛 败者 的能力值,令 w 表示整个锦标赛最终胜者的能力值。给定所有满足 1≤i≤k 且 1≤j≤2k−i 的 li,j 以及 w,请还原出 a1,a2,⋯,an。
输入格式:
第一行输入一个整数 k(1≤k≤18)表示锦标赛的轮数。
对于接下来 k 行,第 i 行输入 2k−i 个整数 li,1,li,2,⋯,li,2k−i(1≤li,j≤109),其中 li,j 表示第 i 轮第 j 场比赛 败者 的能力值。
接下来一行输入一个整数 w(1≤w≤109)表示锦标赛最终胜者的能力值。
输出格式:
输出一行 n 个由单个空格分隔的整数 a1,a2,⋯,an,其中 ai 表示第 i 名选手的能力值。如果有多种合法答案,请输出任意一种。如果无法还原出能够满足输入数据的答案,输出一行 No Solution。
请勿在行末输出多余空格。
输入样例1:
3
4 5 8 5
7 6
8
9
输出样例1:
7 4 8 5 9 8 6 5
输入样例2:
2
5 8
3
9
输出样例2:
No Solution
#include<bits/stdc++.h> using namespace std; const int N = 1e7; int k, x; int res[N], id[N][20], tr[N][20]; bool flag = true; int main() { cin >> k; for(int j = 1; j <= k; ++j) { for(int i = 1; i <= (1 << (k - j)); ++i) { cin >> x; if(j == 1) res[i * 2] = x, id[i][1] = i * 2 - 1, tr[i][1] = x; else if(tr[i * 2 - 1][j - 1] > x && tr[i * 2][j - 1] > x) flag = false; else { if(tr[i * 2 - 1][j - 1] <= x) res[id[i * 2 - 1][j - 1]] = x, id[i][j] = id[i * 2][j - 1]; else res[id[i * 2][j - 1]] = x, id[i][j] = id[i * 2 - 1][j - 1]; tr[i][j] = max({x, tr[i * 2 - 1][j - 1], tr[i * 2][j - 1]}); } } } cin >> x; if(x < tr[1][k]) flag = false; else res[id[1][k]] = x; if(!flag) puts("No Solution"); else for(int i = 1; i <= (1 << k); ++i) cout << res[i] << " \n"[i == (1 << k)]; return 0; }
L2-048 寻宝图
给定一幅地图,其中有水域,有陆地。被水域完全环绕的陆地是岛屿。有些岛屿上埋藏有宝藏,这些有宝藏的点也被标记出来了。本题就请你统计一下,给定的地图上一共有多少岛屿,其中有多少是有宝藏的岛屿。
输入格式:
输入第一行给出 2 个正整数 N 和 M(1<N×M≤105),是地图的尺寸,表示地图由 N 行 M 列格子构成。随后 N 行,每行给出 M 位个位数,其中 0 表示水域,1 表示陆地,2-9 表示宝藏。
注意:两个格子共享一条边时,才是“相邻”的。宝藏都埋在陆地上。默认地图外围全是水域。
输出格式:
在一行中输出 2 个整数,分别是岛屿的总数量和有宝藏的岛屿的数量。
输入样例:
10 11
01000000151
11000000111
00110000811
00110100010
00000000000
00000111000
00114111000
00110010000
00019000010
00120000001
输出样例:
7 2
#include<bits/stdc++.h> using namespace std; int n, m, cnt1, cnt2; bool flag; const int dx[4] = {-1, 0, 0, 1}; const int dy[4] = {0, 1, -1, 0}; int main() { cin >> n >> m, getchar(); vector<vector<int>> a(n, vector<int>(m)); for(int i = 0; i < n; ++i) { for(int j = 0; j < m; ++j) { a[i][j] = (getchar() - '0'); } getchar(); } function<void(int, int)> dfs = [&](int x, int y) { if(a[x][y] != 1) flag = true; a[x][y] = 0; for(int i = 0; i < 4; ++i) { int nx = x + dx[i], ny = y + dy[i]; if(nx >= 0 && nx < n && ny >= 0 && ny < m && a[nx][ny]) dfs(nx, ny); } }; for(int i = 0; i < n; ++i) { for(int j = 0; j < m; ++j) { if(a[i][j]) { ++cnt1; flag = false; dfs(i, j); if(flag) ++cnt2; } } } cout << cnt1 << " " << cnt2; return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。