【AtCoder ABC 102】补题AK
A 小学数学
思路

代码
#include <bits/stdc++.h>
using namespace std;
int n;
int main() {
cin >> n;
if (n % 2 != 0) n *= 2;
cout << n;
return 0;
}
B 语法题
思路
循环找极值即可,然后再减即可代码
#include <bits/stdc++.h>
using namespace std;
#define forn(i, l, r) for (int i = l; i <= r; i++)
const int inf = 0x3f3f3f3f;
int n, x;
int ma = -inf, mi = inf;
int main() {
cin >> n;
forn(i, 1, n) cin >> x, ma = max(ma, x), mi = min(mi, x);
cout << ma - mi;
return 0;
}
C 思维
思路

然后累加答案即可
代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define forn(i, l, r) for (int i = l; i <= r; i++)
const int N = 2e5 + 5;
ll n;
ll a[N], b;
ll ans;
int main() {
cin >> n;
forn(i, 1, n) cin >> a[i], a[i] -= i;
sort(a + 1, a + n + 1);
b = a[(n + 1) / 2];
forn(i, 1, n) ans += abs(a[i] - b);
cout << ans;
return 0;
}
D 前缀和 双指针
思路

代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define forn(i, l, r) for (int i = l; i <= r; i++)
const int inf = 0x3f3f3f3f;
const int N = 2e5 + 5;
ll n;
ll x[N], s[N];
ll ans = inf;
int i, j, k;
ll a, b, c, d;
int main() {
cin >> n;
forn(i, 1, n) cin >> x[i], s[i] = s[i - 1] + x[i];
i = 1, k = 3;
for (j = 2; j <= n - 1; j++) {
while (i + 1 < j && abs(s[j] - 2 * s[i]) > abs(s[j] - 2 * s[i + 1])) i++;
while (k + 1 < n && abs(s[n] - 2 * s[k] + s[j]) > abs(s[n] - 2 * s[k + 1] + s[j])) k++;
a = s[i] - s[0], b = s[j] - s[i];
c = s[k] - s[j], d = s[n] - s[k];
ans = min(ans, max({a, b, c, d}) - min({a, b, c, d}));
}
cout << ans;
return 0;
}

浙公网安备 33010602011771号