Codeforces Round #776 (Div. 3) 题解

A - Deletions of Two Adjacent Letters

题意

给出一个字符串长度为奇数和一个字符。两个相邻字符可以删,问是否可以把这个字符串删成这个字符。

Solution

可以发现字符串中其他字符的总数是一个偶数,两个两个删一定是可以满足条件的。

但是可以发现一组 \(\texttt{Hack}\) 数据

abaaa
b

显然,最后只能删成这种情况

aba

于是要加一个判断,判断是否在这个字符之前的其他字符的个数是否是奇数,如果是就无解。

因为我是从 \(0\) 开始读入的,所以应该判断下标是否是偶数。

Code

/*
Writer: ZhengXiangYu
*/
#include <bits/stdc++.h>

using i64 = long long;

int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	
	auto solve = [&]() -> void {
		std::string s;
		char c;
		std::cin >> s >> c;
		for (int i = 0; i < s.size(); i++) {
			if (s[i] == c && (i % 2 == 0)) {
				std::cout << "Yes" << std::endl;
				return;
			}
		}
		std::cout << "No" << std::endl;
		return;
	};
	
	int T;
	std::cin >> T;
	while (T--) {
		solve();
	} 

	return 0;
}

B. DIV + MOD

题意

给出 \(l, r, a\), 求函数 \(f(x) = ⌊\frac{x}{a}⌋ + x \mod a(l\leq x \leq r)\) 的最值。

Solution

显然,可以把函数分成两部分来看。 对于第一部分要求 \(x\) 要尽可能的大, 而对于第二部分要求 \(x\) 尽量是 \(a - 1\)

有点 \(CSP-J \ T1\) 的味道呢。

分成两种情况讨论,第一种情况是 \(r - l >= a\) ,根据鸽巢原理, \(x\) 一定可以是 \(a - 1\)
第二种情况则相反,最优的选择应该是 \(r\)

/*
Writer: ZhengXiangYu
Time:
*/
#include <bits/stdc++.h>

using i64 = long long;

int main() {
//	std::ios::sync_with_stdio(false);
//	std::cin.tie(nullptr);
	auto solve = [&]() -> void {
		int a, l, r;
		scanf("%d%d%d", &l, &r, &a);
		
		int pos = 0;
		if (l / a != r / a) {
			for (int i = r; i >= l; i--) {
				if (i % a != a - 1) {
					i -= i % a;
				}
				if (i % a == a - 1) {
					pos = i;
					break;
				}
			}
		} else {
			pos = r;
		}
		std::cout << pos / a + pos % a << std::endl;
	};
	
	int T;
	std::cin >> T;
	while (T--) {
		solve();
	} 


	return 0;
}

C.Weight of the System of Nested Segments

题意

\(n \times 2\) 个点,时这些点构成的区间互相包含,比如有区间 \(a, b, c\)\(a\) 就要包含 \(b\), 而 \(b\) 则要包含 \(c\), 问选择点的权值最小值和这些嵌套的区间的左端点和右端点。

Solution

可以发现无论选择那些点,都一定可以构成包含的关系,连接 \(p,2\times n - p\) 总是满足条件的(\(1 \le p\le n \times 2\))。

显然是一个贪心了,贪心的选择权值更大的点,然后在像上面一样连接就可以了。

一共排两次序。

Code

/*
Writer: ZhengXiangYu
*/
#include <bits/stdc++.h>

using i64 = long long;

int main() {
	auto solve = [&]() -> void {
		int n, m;
		scanf("%d%d", &n, &m);		
		
		struct node {
			int x, w, id;
			bool operator < (const node &a) const {
				return w < a.w;
			}
		};
		
		std::vector<node> a(m + 1);
		for (int i = 1; i <= m; i++) {
			scanf("%d%d", &a[i].x, &a[i].w);
			a[i].id = i;
		}
		
		std::sort(a.begin() + 1, a.begin() + m + 1);
		
		int ans = 0;
		for (int i = 1; i <= n * 2; i++) {
			ans += a[i].w;
		}
		
		auto cmp = [&](node a, node b) -> bool {
			return a.x < b.x;
		};
		
		std::sort(a.begin() + 1, a.begin() + n * 2 + 1, cmp);
		
		std::cout << ans << std::endl; 
		for (int i = 1; i <= n; i++) {
			std::cout << a[i].id << " " << a[n * 2 - i + 1].id << std::endl;
		}
		
		std::cout << std::endl;
	};
	
	int T;
	std::cin >> T;
	while (T--) {
		solve();
	} 


	return 0;
}

posted @ 2022-03-12 18:24  落花月朦胧  阅读(188)  评论(0编辑  收藏  举报