【赛后反思】【LGR-172-Div.4】洛谷入门赛 #19 赛后反思

【LGR-172-Div.4】洛谷入门赛 #19 赛后反思

今日推歌:Cagayake《無名のエヌ (feat. 重音テト & 可不)》

不正解だ 不正解だった
中途半端な身体は

不是很火的一首歌,连个翻译都没有(悲


Before

最后 5min AK 了,第一次 AK,虽然是入门赛但还是很有成就感的:

image

省流: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

赛时想了好久,后来想到一句话:

打表出奇迹

下表中 \(N_{min}\) 代表 \(k\) 为一定值时,能让每名小朋友拿到的饼干数量都不一样多的最小总饼干数

\(k\) \(1\) \(2\) \(3\) \(4\) \(5\) \(6\) \(7\) ... \(n\)
\(N_{min}\) 1 3 6 10 15 21 28 ... \(\frac{n(n + 1)}{2}\)

不难发现,当饼干数 \(\ge N_{min}\) 时,一定能让每名小朋友都拿到不一样数量的饼干。

为什么呢?

当有 \(k\) 名小朋友时,分别分给他们 \(1,2,3,...,k-1,k\) 块饼干,这样既能保证每个人分到的饼干数都不同,又能保证饼干总数最少。此时易得饼干总数为 \(\frac{n(n + 1)}{2}\).

也就是说,只要饼干总数大于等于 \(\frac{n(n + 1)}{2}\),一定能给每个人分到不同数量的饼干。

因为本题主要是思维难度,代码不给注释

#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 小跳蛙

我的思路是用 \(a_i\) 来储存 \(i\) 号小跳蛙在第 \(a_i\) 个位置上。用 \(emp\) 来储存空位的位置。(实际上可以用 \(a_0\) 或者 \(a_n\) 来代替这个变量来节省空间)

每次小跳蛙调到空位上时,就交换小跳蛙的位置和空位的位置。

需要注意最后输出的时候需要再存一遍每个位置上都是编号为多少的小跳蛙(或许还能优化……?

#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 图像变换

完了这个代码忘传机房群里了

可以直接模拟,把“重复 \(k_2\) 次”看成每行在横行上重复 \(k\),重复后得到的新一行在纵向上重复 \(k\)

#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(从 \(0\) 开始数)

为什么呢?

\(n\) 的二进制右移 \(k\) 位,现在最低位是原来的第 \(k\) 位。

\(\& 1\) 将会取到最低位是否是 \(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 玩家

扫一遍,统计 Genshinplayer 出现的位置

码风比较丑陋就不加注释了(

#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;
}
posted @ 2024-01-22 17:05  _Kiichi  阅读(73)  评论(7编辑  收藏  举报