Educational Codeforces Round 157 (Rated for Div. 2)(A~D题解)

Educational Codeforces Round 157 (Rated for Div. 2)

A. Treasure Chest

就是看钥匙和宝箱的位置,由于拿钥匙不消耗体力,因此如果先拿钥匙或者同时拿到钥匙和宝箱是可以直接打开宝箱的。

但是如果先拿到宝箱一定是先拿宝箱走一段最优,这样后面取回钥匙来能够少走一段路。

时间复杂度 O ( t ) O(t) O(t)

#include <bits/stdc++.h>

using i64 = long long;

void solve() {
	int x, y, k;
	std::cin >> x >> y >> k;

	int ans = 0;
	if (y <= x) {
		ans = x;
	} else {
		if (y - x <= k) {
			ans = y;
		} else {
			ans = 2 * y - x - k;
		}
	}

	std::cout << ans << "\n";
}

int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

	int t;
	std::cin >> t;

	while (t--) {
		solve();
	}

	return 0;
}
B. Points and Minimum Distance

其实就是把 2 ∗ n 2*n 2n个点划分为两个集合,使得集合内部相邻两个数的差值的和最小。

所以其实只要排个序,让相邻的两个数相减就好了。

时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

#include <bits/stdc++.h>

using i64 = long long;

void solve() {
	int n;
	std::cin >> n;

	n *= 2;
	std::vector<int> a(n);
	for (int i = 0; i < n; i++) {
		std::cin >> a[i];
	}

	int ans = 0;
	std::vector<std::pair<int, int>> res(n / 2);
	std::sort(a.begin(), a.end());
	for (int i = 0; i < n / 2; i++) {
		res[i] = {a[i], a[i + n / 2]};
	}
	for (int i = 1; i < n / 2; i++) {
		ans += res[i].first - res[i - 1].first + res[i].second - res[i - 1].second;
	}
	std::cout << ans << "\n";
	
	for (auto [x, y] : res) {
		std::cout << x << " " << y << "\n";
	}
}

int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

	int t;
	std::cin >> t;

	while (t--) {
		solve();
	}

	return 0;
}
C. Torn Lucky Ticket

这道题实在没想到怎么做。

按照长度来存储字符串,然后枚举这两个长度的字符串看是否满足情况。

由于当前正枚举的长度 x , y x,y x,y已经确定,记 h = ( x + y ) / 2 h=(x+y)/2 h=(x+y)/2,所以实际上是可以确定哪一部分字符属于左半边,哪一部分字符属于右半边。

对于左边长度小于 h h h的部分,权加上当前数位;当左边长度大于 h h h的部分,权减去当前数位。

这样做的原因其实就是,左边部分减去是和右边部分加上是等价的,对于右边的部分也类似。

时间复杂度 O ( 25 n ) O(25n) O(25n)

#include <bits/stdc++.h>

using i64 = long long;

int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

	int n;
	std::cin >> n;

	std::array<std::vector<std::string>, 6> f;
	for (int i = 0; i < n; i++) {
		std::string s;
		std::cin >> s;

		int len = s.size();
		f[len].push_back(s);
	}

	i64 ans = 0;
	for (int x = 1; x <= 5; x++) {
		for (int y = 1 ; y <= 5; y++) {
			if ((x + y) % 2 == 0) {
				std::array<int, 100> cnt{};
				int h = (x + y) / 2;
				for (auto s : f[x]) {
					int mask = 50;
					for (int i = 0; i < x; i++) {
						if (i < h) {
							mask += s[i] - '0';
						} else {
							mask -= s[i] - '0';
						}
					}

					cnt[mask] += 1;
				}

				for (auto s : f[y]) {
					int mask = 50;
					for (int i = 0; i < y; i++) {
						if (i + x >= h) {
							mask += s[i] - '0';
						} else {
							mask -= s[i] - '0';
						}
					}

					ans += cnt[mask];
				}
			}
		}
	}

	std::cout << ans << "\n";
	return 0;
}
D. XOR Construction

本来以为是个构造,但其实就是一个贪心。

对于这类涉及位运算的题目,首先一个就是应该考虑拆位,这个大家应该是都能够想到的。

其实是异或操作,异或其实是可以相消的,把 b i ⊕ b i + 1 = a i b_i \oplus b_{i + 1} = a_i bibi+1=ai的式子全部异或起来就会发现 b 1 ⊕ b j + 1 = ⊕ k = 1 j a k b_1 \oplus b_{j+1} = \oplus_{k = 1}^{j}a_k b1bj+1=k=1jak,等价于 b j + 1 = ⊕ k = 1 j a k ⊕ b 1 b_{j+1} = \oplus_{k = 1}^{j}a_k \oplus b_1 bj+1=k=1jakb1

也就是说只要确定了第一项,那么后面的每一项就都可以确定了。

由于题目限制了 b i b_i bi是从 0 0 0 n − 1 n-1 n1的,那么其实我们需要让所有的 b i b_i bi尽可能小。

因此我们只要做一个 a i a_i ai的异或前缀和然后考虑每一位上 a i a_i ai的0和1的个数以确定 b 1 b_1 b1当前这一位应该是0还是1就好了。
时间复杂度 O ( 31 n ) O(31n) O(31n)

#include <bits/stdc++.h>

using i64 = long long;

int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

	int n;
	std::cin >> n;

	std::vector<int> a(n);

	for (int i = 0; i < n - 1; i++) {
		int x;
		std::cin >> x;
		a[i + 1] = a[i] ^ x;
	}

	int ans = 0;
	for (int i = 30; i >= 0; i--) {
		int res = 0;
		for (int j = 1; j < n; j++) {
			res += a[j] >> i & 1;
		}

		if (n <= 2 * res) {
			ans |= 1 << i;
		}
	}

	std::cout << ans << " ";
	for (int j = 1; j < n; j++) {
		std::cout << (ans ^ a[j]) << " \n"[j == n];
	}

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值