Codeforces Round 666 (Div. 2) 解题报告

对应场次为 CF1397 (Div1=1396)


A. Juggling Letters

题目大意

给定 \(n(1 \le n \le 1000)\) 个仅由小写字母组成的字符串 你可以选择 \(s_i\) 中的一个字符拿出来插入到 \(s_j\) 的任意位置(允许 \(i = j\))问操作若干次能否让这 \(n\) 个字符串都相等

保证字符串总长度不超过 \(1000\)

Solution

考虑把所有字符都拿出来然后统一分配 那么只需要保证每个字符出现次数都为 \(n\) 的倍数即可

点击查看代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;

inline int read() {
	ll xr = 0, F = 1;
	char cr;
	while (cr = getchar(), cr < '0' || cr > '9') if (cr == '-') F = -1;
	while (cr >= '0' && cr <= '9')
		xr = (xr << 3) + (xr << 1) + (cr ^ 48), cr = getchar();
	return xr * F;
}

void write(ll x) {
	char ws[51];
	int wt = 0;
	if (x < 0) putchar('-'), x = -x;
	do {
		ws[++wt] = x % 10 + '0';
		x /= 10;
	} while (x);
	for (int i = wt; i; --i) putchar(ws[i]);
}

namespace steven24 {

int c[26];
int T, n;

void main() {
	T = read();
	while (T--) {
		memset(c, 0, sizeof c);
		n = read();
		string s;
		for (int k = 1; k <= n; ++k) {
			cin >> s;
			for (int i = 0; i < s.length(); ++i) ++c[s[i] - 'a'];
		}
		bool flag = 1;
		for (int i = 0; i < 26; ++i) {
			if (c[i] % n) {
				flag = 0;
				break;
			}
		}
		if (flag) puts("YES");
		else puts("NO");
	}
}

}

int main() {
	steven24::main();
	return 0;
}

B. Power Sequence

题目大意

给定一个长度为 \(n(3 \le n \le 10^5)\) 的数列 \(a\) 你可以将这个数列按任意顺序排布
然后你可以任选一个首项为 1 的等比数列 \(b\)\(\min(\sum\limits_{i = 1}^n \left|a_i - b_i\right|)\)

Solution

首先从小到大排序肯定是没有问题的
然后枚举公比 \(c\) 保证 \(c^{n - 1}\) 不炸 long long 暴力计算即可
复杂度为 \(\text{O}(n \sqrt[n]{4 \times 10^{18}})\)

点击查看代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;

inline ll read() {
	ll xr = 0, F = 1;
	char cr;
	while (cr = getchar(), cr < '0' || cr > '9') if (cr == '-') F = -1;
	while (cr >= '0' && cr <= '9')
		xr = (xr << 3) + (xr << 1) + (cr ^ 48), cr = getchar();
	return xr * F;
}

void write(ll x) {
	char ws[51];
	int wt = 0;
	if (x < 0) putchar('-'), x = -x;
	do {
		ws[++wt] = x % 10 + '0';
		x /= 10;
	} while (x);
	for (int i = wt; i; --i) putchar(ws[i]);
}

namespace steven24 {

const int N = 1e5 + 0721;
const ll inf = 0x7ffffffffffffff;
ll a[N], b[N];
int n;
ll ans;

void main() {
	n = read();
	for (int i = 1; i <= n; ++i) a[i] = read();
	sort(a + 1, a + 1 + n);
	ans = inf;
	int k = pow(inf, 1.0 / n);
//	cout << k << "\n";
	b[1] = 1;
	for (int i = 1; i <= k; ++i) {
		for (int j = 2; j <= n; ++j) b[j] = b[j - 1] * i;
		ll sum = 0;
		for (int j = 1; j <= n; ++j) sum += abs(b[j] - a[j]);
		ans = min(ans, sum);
	}
	write(ans), putchar('\n');
}

}

int main() {
	steven24::main();
	return 0;
}

C. Multiples of Length

天天被div2卡C 已经习惯了

题目大意

给你一个长度为 \(n(1 \le n \le 10^5)\) 的数列 每次你可以选择一个长度为 \(len\) 的区间 给区间的每个数都分别加减 \(len\) 的整数倍 你需要通过恰好三次操作把数列变为全0数列 输出构造方案

Solution

官方题解 一目了然 不言而喻

image

点击查看代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;

inline int read() {
	ll xr = 0, F = 1;
	char cr;
	while (cr = getchar(), cr < '0' || cr > '9') if (cr == '-') F = -1;
	while (cr >= '0' && cr <= '9')
		xr = (xr << 3) + (xr << 1) + (cr ^ 48), cr = getchar();
	return xr * F;
}

void write(ll x) {
	char ws[51];
	int wt = 0;
	if (x < 0) putchar('-'), x = -x;
	do {
		ws[++wt] = x % 10 + '0';
		x /= 10;
	} while (x);
	for (int i = wt; i; --i) putchar(ws[i]);
}

namespace steven24 {

const int N = 1e5 + 0721;
ll a[N], b[N];
int n;

void main() {
	n = read();
	for (int i = 1; i <= n; ++i) a[i] = read();
	if (n == 1) {
		puts("1 1");
		puts("0");
		puts("1 1");
		puts("0");
		puts("1 1");
		write(-a[1]), putchar('\n');
	} else {
		puts("1 1");
		write(-a[1]), putchar('\n');
		write(1), putchar(' '), write(n), putchar('\n');
		write(0), putchar(' ');
		for (int i = 2; i <= n; ++i) write(-1ll * a[i] * n), putchar(' ');
		putchar('\n');
		write(2), putchar(' '), write(n), putchar('\n');
		for (int i = 2; i <= n; ++i) write(1ll * a[i] * (n - 1)), putchar(' ');
		putchar('\n');
	}
}

}

int main() {
	steven24::main();
	return 0;
}

D. Stoned Game

题目大意

给定 \(n(1 \le n \le 100)\) 堆石子 两人轮流选一堆拿一个走 但是不能拿上次对方拿的那堆 询问先手是否必胜

Solution

如果存在一堆石子比其它 \(n - 1\) 堆加起来都多 那么只要先手一直拿那一堆必胜
否则 两人一定都不会出现自己拿完之后变成上面那种情况 所以最后一定所有石子都被取完 判断和的奇偶性即可

点击查看代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;

inline int read() {
	ll xr = 0, F = 1;
	char cr;
	while (cr = getchar(), cr < '0' || cr > '9') if (cr == '-') F = -1;
	while (cr >= '0' && cr <= '9')
		xr = (xr << 3) + (xr << 1) + (cr ^ 48), cr = getchar();
	return xr * F;
}

void write(ll x) {
	char ws[51];
	int wt = 0;
	if (x < 0) putchar('-'), x = -x;
	do {
		ws[++wt] = x % 10 + '0';
		x /= 10;
	} while (x);
	for (int i = wt; i; --i) putchar(ws[i]);
}

namespace steven24 {

const int N = 521;
int a[N];
int n, T;

void main() {
	T = read();
	while (T--) {
		n = read();
		for (int i = 1; i <= n; ++i) a[i] = read();
		int maxn = *max_element(a + 1, a + 1 + n);
		ll sum = 0;
		for (int i = 1; i <= n; ++i) sum += a[i];
		if (maxn > sum / 2 || sum & 1) puts("T");
		else puts("HL");
	}
}

}

int main() {
	steven24::main();
	return 0;
}
posted @ 2023-11-01 08:39  Steven24  阅读(15)  评论(0)    收藏  举报