【赛后反思】【LGR-172-Div.4】洛谷入门赛 #19 赛后反思
【LGR-172-Div.4】洛谷入门赛 #19 赛后反思
今日推歌:Cagayake《無名のエヌ (feat. 重音テト & 可不)》
不正解だ 不正解だった
中途半端な身体は
不是很火的一首歌,连个翻译都没有(悲
Before
最后 5min AK 了,第一次 AK,虽然是入门赛但还是很有成就感的:
省流:STL大胜利
A 分饼干I
最少的两盒相加,这样和剩下的一盒差距最小,然后再把多的分给 Z,少的分给 yz 就可以了
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
int a[4], b, c;
int main() {
scanf("%d%d%d", a + 1, a + 2, a + 3);
sort(a + 1, a + 4); // 用的 sort 来寻找最少的两盒
b = a[1] + a[2], c = a[3];
printf("%d %d\n", max(b, c), min(b, c));
return 0;
}
B 分饼干II
赛时想了好久,后来想到一句话:
打表出奇迹
下表中
... | |||||||||
---|---|---|---|---|---|---|---|---|---|
1 | 3 | 6 | 10 | 15 | 21 | 28 | ... |
不难发现,当饼干数
为什么呢?
当有
也就是说,只要饼干总数大于等于
因为本题主要是思维难度,代码不给注释
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
int T;
ll n, k;
int main() {
scanf("%d", &T);
while(T--) {
scanf("%lld%lld", &n, &k);
if(n >= k * (k + 1) / 2) puts("Yes");
else puts("No");
}
return 0;
}
C 跳房子
一开始以为是前年(2022)暑假 OJ 上一场模拟赛的 T1,仔细一看其实只是一道简单的模拟。
如果先跳后判断的话第一个点会 WA,因为根本不需要跳就已经胜利了。
↑来自机房 lcj 老师的发现
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e6 + 5;
int n, a[N], now = 1, tot;
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%d", a + i);
while(now < n) ++tot, now += a[now];
//↑步数+1,按照题意跳跃,如果跳了出去就结束循环
if(now == n) puts("Yes"); //胜利
else puts("No");
printf("%d\n", tot); //输出步数
return 0;
}
D 区间函数最大值
十年OI一场空,不开 long long 见祖宗
把符合条件的每个结果都扫一遍,比较大小。需要注意的是多项式的每一项都要取模。
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
ll a, b, c, d, e, f, g, p, x, xx, y, yy, maxa;
int main() {
scanf("%lld%lld%lld%lld%lld%lld%lld%lld%lld%lld%lld%lld", &a, &b, &c, &d, &e, &f, &g, &p, &x, &xx, &y, &yy);
for(int i = x; i <= xx; ++i) for(int j = y; j <= yy; ++j) maxa = max(maxa, ((a * i * i * i) % p + (b * j * j * j) % p + (c * i * i * j) % p + (d * i * j * j) % p + (e * i * j) % p + (f * i) % p + (g * j) % p) % p);
// ↑压行严重所以比较丑,实际上就是循环比较每个 f(x,y).
printf("%lld\n", maxa);
return 0;
}
E 小跳蛙
我的思路是用
每次小跳蛙调到空位上时,就交换小跳蛙的位置和空位的位置。
需要注意最后输出的时候需要再存一遍每个位置上都是编号为多少的小跳蛙(或许还能优化……?
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e6 + 5;
int n, a[N], b[N], cnt, emp;
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%d", &cnt);
a[cnt] = i; // 编号为 cnt 的小跳蛙在第 i 号位置上
if(!cnt) emp = i; // 标记空位的位置
}
for(int i = 1; i < n; ++i) swap(a[i], emp); // 交换空位的位置和小跳蛙的位置
for(int i = 1; i < n; ++i) b[a[i]] = i; // 第 a[i] 号位置上是第 i 只小跳蛙
for(int i = 1; i <= n; ++i) printf("%d ", b[i]);
return 0;
}
F 图像变换
完了这个代码忘传机房群里了
可以直接模拟,把“重复
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
int n, m, k;
char ch[105][105];
int main() {
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) cin >> ch[i][j];
for(int i = 1; i <= n; ++i) {
for(int o = 1; o <= k; ++o) {
for(int j = 1; j <= m; ++j) for(int l = 1; l <= k; ++l) printf("%c", ch[i][j]);
// ↑横向复制
putchar('\n');
}
//↑纵向复制
}
return 0;
}
二进制与一
根据百度搜索(bushi)我们可以得到获取一个数上二进制从右往左数的第 k 位的代码是 (n >> k) & 1
(从
为什么呢?
再
因此得到代码:
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
ll n, ans, a; int q, k;
int main() {
scanf("%lld%d", &n, &q);
ans = n; // 不改变 n 的值
while(q--) {
scanf("%d", &k); --k;
while(!((ans >> k) & 1)) ++ans; // 把第 k 位变成 1
}
printf("%lld\n", ans - n);
return 0;
}
Genshin 玩家
扫一遍,统计 Genshin
和 player
出现的位置
码风比较丑陋就不加注释了(
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
string s;
vector<int> l1, l2; int ans;
int main() {
cin >> s;
for(int i = 0; i < s.size() - 6; ++i) {if(s[i] == 'G' && s[i + 1] == 'e' && s[i + 2] == 'n' && s[i + 3] == 's' && s[i + 4] == 'h' && s[i + 5] == 'i' && s[i + 6] == 'n') {l1.push_back(i + 1); i += 6; }}
for(int i = 0; i < s.size() - 5; ++i) {if(s[i] == 'p' && s[i + 1] == 'l' && s[i + 2] == 'a' && s[i + 3] == 'y' && s[i + 4] == 'e' && s[i + 5] == 'r') {l2.push_back(i + 1); i += 5; }}
for(int i = 0; i < l1.size(); ++i) for(int j = 0; j < l2.size(); ++j) if(l2[j] > l1[i]) ++ans;
printf("%d\n", ans);
return 0;
}
本文作者:Kiichi
本文链接:https://www.cnblogs.com/Kiichi/p/17980479/rumen19kaohoufansi
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步