【AtCoder】AtCoder Grand Contest 032 题解

本文详细介绍了AtCoder Grand Contest 032的比赛题目,包括A到F六道题目。针对每道题目,文章提供了思路要点,如采用的时间复杂度最优的策略,并附带了相应的代码实现。A题通过删除最大值为i的元素来模拟,B题构建完全图后删除特定边,C题讨论欧拉图的分隔策略,D题用动态规划解决旋转排序问题,E题采用二分查找找到最佳匹配分界点,F题通过计算期望值求解最小非负夹角。所有题目解决方案的时间复杂度介于O(N^2)到O(N)之间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【比赛链接】

【题解链接】

【A】 Limited Insertion

【思路要点】

  • 考虑时间倒流,对于一个位置 i i i ,若 a i = i a_i=i ai=i ,则可以将其删去,问是否能将序列删空。
  • 不难发现每次删除最大的 i i i ,使得 a i = i a_i=i ai=i 是唯一的最优策略,模拟之,若无法操作则无解。
  • 时间复杂度 O ( N 2 ) O(N^2) O(N2)

【代码】

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
template <typename T> void chkmax(T &x, T y) {
    x = max(x, y); }
template <typename T> void chkmin(T &x, T y) {
    x = min(x, y); } 
template <typename T> void read(T &x) {
    
	x = 0; int f = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
	for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
	x *= f;
}
template <typename T> void write(T x) {
    
	if (x < 0) x = -x, putchar('-');
	if (x > 9) write(x / 10);
	putchar(x % 10 + '0');
}
template <typename T> void writeln(T x) {
    
	write(x);
	puts("");
}
int n, a[MAXN], ans[MAXN];
int main() {
    
	read(n);
	for (int i = 1; i <= n; i++)
		read(a[i]);
	for (int i = n; i >= 1; i--) {
    
		int pos = 0;
		for (int j = 1; j <= i; j++)
			if (a[j] == j) pos = j;
		if (pos == 0) {
    
			puts("-1");
			return 0;
		}
		ans[i] = pos;
		for (int j = pos; j < i; j++)
			a[j] = a[j + 1];
	}
	for (int i = 1; i <= n; i++)
		writeln(ans[i]);
	return 0;
}

【B】 Balanced Neighbors

【思路要点】

  • 考虑构成一张完全图,再删去若干条边使其合法。
  • N N N 为奇数,可以删去边 1 − ( N − 1 ) , 2 − ( N − 2 ) . . . 1-(N-1),2-(N-2)... 1(N1),2(N2)...
  • N N N 为偶数,可以删去边 1 − N , 2 − ( N − 1 ) . . . 1-N,2-(N-1)... 1N,2(N1)...
  • 不难发现剩余的图一定也是连通的。
  • 时间复杂度 O ( N 2 ) O(N^2) O(N2)

【代码】

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
template <typename T> void chkmax(T &x, T y) {
    x = max(x, y); }
template <typename T> void chkmin(T &x, T y) {
    x = min(x, y); } 
template <typename T> void read(T &x) {
    
	x = 0; int f = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
	for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
	x *= f;
}
template <typename T> void write(T x) {
    
	if (x < 0) x = -x, putchar('-');
	if (x > 9) write(x / 10);
	putchar(x % 10 + '0');
}
template <typename T> void writeln(T x) {
    
	write(x);
	puts("");
}
int n; vector <pair <int, int>> a;
int main() {
    
	read(n);
	for (int i = 1; i <= n; i++)
	for (int j = i + 1; j <= n; j++)
		if (i + j != n + (n + 1) % 2) a.emplace_back(i, j);
	writeln(a.size());
	for (auto x : a)
		printf("%d %d\n", x.first, x.second);
	return 0;
}

【C】 Three Circuits

【思路要点】

  • 首先,若这张图不是一张欧拉图,答案为 N o No No ,下令各点度数为偶数。
  • 若存在一个点度数 ≥ 6 \geq 6 6 ,该点将在欧拉回路上出现至少 3 3 3 次,我们可以将该欧拉回路分成 3 3 3 部分,答案为 Y e s Yes Yes ,下令各点度数 ∈ { 2 , 4 } \in \{2,4\} { 2,4} ,记度为 4 4 4 的点数为 c n t 4 cnt_4 cnt4
  • c n t
### AtCoder Problem 393 或者比赛信息 AtCoder Beginner Contest 175 的 C 题目名为 "Walking Takahashi",涉及到了与倍数有关的三种不同情况分析[^1]。此题目描述了一个特定场景下的行走路径计算问题。 对于具体编号为 393 的问题,在 AtCoder 平台上并没有直接对应的问题编号;然而,可以推测这可能是用户提及的具体某场比赛中的一个问题。通常情况下,AtCoder 上的比赛分为多个级别,包括但不限于: - **Beginner Contests (ABC)**:面向编程初学者的比赛系列。 - **Regular Contests (ARC)**:难度稍高的常规赛。 - **Grand Contests (AGC)**:最高级别的竞赛活动。 如果要查找具体的第 393 号问题或者相关联的比赛详情,则建议访问官方网址并利用其内置搜索功能来定位目标内容。此外,也可以通过社区论坛获取更多关于该主题的信息交流和支持。 另一个值得注意的例子是在某个案例中提到中心坐标和高度被识别为 `(100,0)` 和 `193`【题解】[^2]。虽然这不是直接针对 ABC175-C 或者编号 393 的说明,但是展示了如何解析几何图形属性的方法论。 #### 关于输入字符串处理的一般方法 当面对长度介于 3 到 100 字符之间由两个不同的小写字母组成的字符串 \(S\) 时,其中除了一个字符外其余全部相同[^4],可以通过遍历整个字符串找到唯一的异常字符位置来进行求解操作。这类问题常见于字符串匹配算法练习之中。 ```python def find_unique_char(s): char_count = {} for char in s: if char not in char_count: char_count[char] = 1 else: char_count[char] += 1 for key,value in char_count.items(): if value == 1: return key # Example usage print(find_unique_char("aaab")) # Output should be 'b' ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值