【赛后总结】トヨタ自動車プログラミングコンテスト2024#9(待补完)
AtCoder Beginner Contest 370 赛后总结
成绩速览:
展开目录
A Raise Both Hands-100pts
展开翻译
高桥君决定制作章鱼烧,并给苏介君吃。他告诉苏介君,如果想吃章鱼烧,就举起左手;否则,举起右手。
苏介君举手的结果,用两个整数 \(L,R\) 表示。当 \(L=1\) 时,他举起左手;当 \(R=1\) 时,他举起右手。苏介君并不总是听从指令,他有时举两只手或者不举任何一只手。
如果苏介君只举起左手,代表想吃章鱼烧,请输出Yes
;如果他只举起右手,代表不想吃章鱼烧,请输出No
.如果他两只手都举或者都不举,请输出 'Invalid'.
如果苏介君只举起一只手,说明他遵守了指令。
题面就差没把代码给出来了。
如果 \(L\) 为 \(1\) 而 \(R\) 为 \(0\),输出 Yes
;\(R\) 为 \(1\) 而 \(L\) 为 \(0\),输出 No
;其他情况输出 Invalid
.
展开代码
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
int a, b;
int main() {
scanf("%d%d", &a, &b);
if(a && !b) puts("Yes");
else if(!a && b) puts("No");
else puts("Invalid");
return 0;
}
B Binary Alchemy-200pts
展开翻译
有 \(N\) 个元素,编号为 \(1,2,...,N\).
你可以合成两个元素 \(i\) 和 \(j\). 当 \(i\ge j\) 时,它们会变为 \(A_{i,j}\);否则,它们变为 \(A_{j,i}\).
使元素 \(1\) 与元素 \(1,2,...,N\) 合成,求问最后得到的结果。
赛时机翻把题意翻译错了,调了好久。
可以看出来,元素 \(i\) 和元素 \(j\) 合成的结果其实就是 \(A_{max\{i,j\},min\{i,j\}}\).
然后一个个合成过去,最后输出就好。
展开代码
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
int n, a[105][105], ans = 1;
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) for(int j = 1; j <= i; ++j) scanf("%d", a[i] + j);
for(int i = 1; i <= n; ++i) ans = a[max(ans, i)][min(ans, i)];
printf("%d\n", ans);
return 0;
}
C Word Ladder-300pts
展开翻译
给你两个由小写英文字母组成的字符串 \(S,T\).保证 \(|S|=|T|\).
使 \(X\) 为空序列,你可以通过以下操作来使 \(S\) 变成 \(T\).
- 修改 \(S\) 的一位,之后将当前的 \(S\) 作为一个元素加入到 \(X\) 的末尾。
求 \(S=T\) 时,元素最少的 \(X\) 序列。若有多种答案,输出字典序最小的一个。
的确是一种贪心。
我们发现,当把字典序较大的字母修改成字典序较小的字母时,要修改的字母越靠前,修改出来的结果字典序越小,反之同理。
于是可以用 \(X_i\) 记录第 \(i\) 次更改时 \(S\) 的内容。然后正着扫一遍 \(S\),如果 \(S_i\) 的字典序大于 \(T_i\) 就改,再反着扫一遍把剩下的不同的改了就行。
展开代码
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
char s[105], t[105], x[105][105];
int ans = 0;
int main() {
scanf("%s%s", s, t);
// if(s == t) puts("0");
// cerr << ans << endl;
for(int i = 1; i <= 100; ++i) {
for(int j = 0; j < strlen(s); ++j) x[i][j] = s[j];
// cerr << ans << "鸟\n";
}
// cerr << ans << endl;
for(int i = 0; i < strlen(s); ++i) {
if(s[i] > t[i]) {
++ans;
for(int j = ans; j <= 100; ++j) x[j][i] = t[i];
s[i] = t[i];
// cerr << ans << "花" << endl;
}
}
// cerr << ans << endl;
for(int i = strlen(s) - 1; i >= 0; --i) {
if(s[i] < t[i]) {
++ans;
for(int j = ans; j <= 100; ++j) x[j][i] = t[i];
s[i] = t[i];
}
}
printf("%d\n", ans);
for(int i = 1; i <= ans; ++i) printf("%s\n", x[i]);
return 0;
}