【AtCoder ABC 100】补题AK

比赛链接

A 思维

思路 一个人最多只能拿 8 块蛋糕(隔一个取一个),直接判断是不是都小于等于8即可
代码
#include <bits/stdc++.h>
using namespace std;

int a, b;
int main() {
	cin >> a >> b;

	if (a <= 8 && b <= 8) cout << "Yay!";
	else cout << ":(";
	return 0;
}

B 思维

思路

image

代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long

ll d, n;
ll ans;
int main() {
	cin >> d >> n;

	ans = pow(100, d) * n;
	if (n == 100) ans += pow(100, d);

	cout << ans;
	return 0;
}

C 贪心

思路 *3并不会影响操作数,但/2会影响(/2的次数是有限的),那么为了最大化操作数,每次选一个能/2的数操作,其他都*3,那么答案就是每个数能被/2次数之和
代码
#include <bits/stdc++.h>
using namespace std;
#define forn(i, l, r) for (int i = l; i <= r; i++)

int n, x;
int ans;
int main() {
	cin >> n;

	forn(i, 1, n) {
		cin >> x;
		while (x % 2 == 0) ans++, x /= 2;
	}

	cout << ans;
	return 0;
}

D 排序 枚举

思路 $max(︱x︱) = max(x, -x)$

\(max(︱x︱ + ︱y︱) = max(x + y, x - y, -x + y, -x - y)\)

同理\(︱x︱ + ︱y︱+︱z︱\)就应该有8种情况

把这8种情况都判断一遍,对于每一种情况,排序取前m个,再取最大值即可(不开long long见祖宗 )

代码
#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 = 1e3 + 5;

ll n, m;
struct node {
	ll a, b, c;
} s[N];
ll i, j, k;
bool cmp(node x, node y) {
	ll tx = x.a * i + x.b * j + x.c * k;
	ll ty = y.a * i + y.b * j + y.c * k;
	return tx > ty;
}
ll ans, res;
int main() {
	cin >> n >> m;
	forn(i, 1, n) cin >> s[i].a >> s[i].b >> s[i].c;

	for (i = -1; i <= 1; i += 2) {
		for (j = -1; j <= 1; j += 2) {
			for (k = -1; k <= 1; k += 2) {
				sort(s + 1, s + n + 1, cmp);
				res = 0;
				forn(ii, 1, m) res += s[ii].a * i + s[ii].b * j + s[ii].c * k;
				ans = max(ans, res);
			}
		}
	}

	cout << ans;
	return 0;
}
posted @ 2023-11-04 11:30  史上最速败犬  阅读(33)  评论(0)    收藏  举报