# Codeforces Round 951 (Div. 2) 题解分享

25 篇文章 1 订阅

## A. Guess the Maximum

### code

inline void solve() {
int n; cin >> n;
vector<int> a(n + 1);
for (int i = 1; i <= n; i ++ ) cin >> a[i];
int minv = 1e9;
for (int i = 1; i < n; i ++ ) {
minv = min(minv, max(a[i], a[i + 1]));
}
cout << minv - 1 << endl;
return;
}

## B. XOR Sequences

### 思路

Q：该怎么做？真的是打暴力么？

A：打暴力肯定是错误的，题目中给了一个神奇的条件，，假设我们让a和b分别从i和j的位置开始相等，即满足，当我们注意到这个条件的时候，自然而然的就会把x异或过去。

Q：我懂了，然后怎么做，感觉还是找不出来数量。

A：结合样例二，x XOR y = 1000，而答案为8。

Q：其实这样也能猜出来是2的(0的个数次)

A：后面3个零，也就是8。后面如果选的bj后面三位有1，这样往上加1的过程肯定是两个相等的情况一定是小于8的，换句话说，这个一卡着了最大长度。

### code

inline void solve() {
int a, b; cin >> a >> b;
int x = a ^ b;
cout << (x & (-x)) << endl;
return;
}

## C. Earning on Bets

Q：首先猜一个lcm

A：然后用lcm实现刚好合适（）

### code

inline void solve() {
ll n; cin >> n;
vector<ll> a(n + 1);
ll g = 1;
for (int i = 1; i <= n; i ++ ) {
cin >> a[i];
g = lcm(g, a[i]);
}
ll sum = 0;
for (int i = 1; i <= n; i ++ ) {
sum += g / a[i];
}
if (sum >= g) cout << -1 << endl;
else {
for (int i = 1; i <= n; i ++ ) {
cout << g / a[i] << ' ';
}
cout << endl;
}
return;
}

## D. Fixing a Binary String

### 思路

111 | 00001

1 | 110

1110001 | 00011

| 00000

1010 | 01

0111000 | 1

110 | 001100110

| 0011001100110011   p = 2

101110 | 000  p = 3

1 | 11100011  p = 3

### code

inline void solve() {
int n, k; cin >> n >> k;
string s; cin >> s;
s = " " + s;
int j = n, len = 0;
while (len < k && s[j] == s[n]) j -= 1, len += 1;
int ok = j, ji = len;
if (j == 0) return cout << n << endl, void();
if (s[j] != s[n]) {
while (true) {
char cur = s[j];
len = 0;
while (s[j] == cur) j -= 1, len += 1;
if (len == k) ok = j;
else if (len > k) {
ok = j + len - k;
break;
}else break;
if (j == 0) break;
}
}
if (ok == 0) {
if (ji == k) cout << n << endl;
else cout << -1 << endl;
return;
}
reverse(s.begin() + 1, s.begin() + 1 + ok);
s = " " + s.substr(1 + ok) + s.substr(1, ok);
len = 0;
int cur = s[1] - '0';
bool flag = true;
for (int i = 1; i <= n - k; i ++ ) {
if (s[i] - '0' != cur) flag = false;
len += 1;
if (len == k) len = 0, cur ^= 1;
if (s[i + k] == s[i]) flag = false;
}
if (k == n) {
char tt = s[1];
for (int i = 1; i <= n; i ++ ) if (s[i] != tt) flag = false;
}
if (flag) cout << ok << endl;
else cout << -1 << endl;
return;
}

• 20
点赞
• 5
收藏
觉得还不错? 一键收藏
• 1
评论
04-23 206
06-08 865
06-09 1096
02-28 403
06-08 895
06-12 864
08-27 982
06-10 724
09-11 1098
09-11 258

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