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
官方题解 一目了然 不言而喻

点击查看代码
#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;
}

浙公网安备 33010602011771号