【AtCoder ABC 102】补题AK

比赛链接

A 小学数学

思路

image

代码
#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 思维

思路

image

然后累加答案即可

代码
#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 前缀和 双指针

思路

image

代码
#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;
}
posted @ 2023-11-14 10:33  史上最速败犬  阅读(12)  评论(0)    收藏  举报