【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 思维
思路

代码
#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;
}

浙公网安备 33010602011771号