比賽連結:牛客周賽48
A
思路
因為只能+1,所以選擇最大的數字作為三個數字操作後的重點,所以求出最後的結果為max(a, b, c) * 3,再減去當前的數字大小就可以知道需要操作多少次了。
程式碼
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e5 + 10;
int main() {
int a, b, c;
cin >> a >> b >> c;
cout << max(a, max(b, c)) * 3 - a - b - c << endl;
return 0;
}
B
思路
依次列舉區間左端點,然後固定左端點,列舉右端點,暴力查詢偽迴文數之和。
程式碼
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
int len = s.length();
s = " " + s;
int res = 0;
for (int i = 1; i <= len; i++) {
for (int j = i + 1; j <= len; j++) {
int l = i, r = j, ans = 0;
while (l <= r) {
if (s[l++] != s[r--]) ans++;
}
res += ans;
}
}
cout << res << endl;
return 0;
}
C
思路
程式碼
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e5 + 10;
vector<pair<int, int>>ve;
int main() {
int n, count = 0;
cin >> n;
string s1, s2;
cin >> s1 >> s2;
s1 = " " + s1, s2 = " " + s2;
for (int i = 1; i <= n; i++) {
if (s1[i] == s2[i]) continue;
// 只剩最後一個元素不同時,無解
if (i + 1 > n) count = -2;
if (s1[i] == '1') {
s1[i] = '0', s1[i + 1] = (s1[i + 1] == '0' ? '1' : '0');
}
else {
s1[i] = '1', s1[i + 1] = (s1[i + 1] == '1' ? '0' : '1');
}
count ++;
ve.push_back({i, i + 1});
}
cout << count << endl;
//特判無解的情況
if (count == -1) return 0;
for (int i = 0; i < count; i++) {
cout << ve[i].first << " " << ve[i].second << endl;
}
return 0;
}
D
思路
程式碼
E
思路
程式碼
F
思路
程式碼