AtCoder Beginner Contest 100

A

直接算能被2整除的个数和。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// LUOGU_RID: 174647527
#include <bits/stdc++.h>
using namespace std;
int n, a, ans;
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a);
while (a % 2 == 0)
ans++, a /= 2; // 累加
}
printf("%d", ans);
return 0;
}

B

直接暴力枚举符号进行排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// LUOGU_RID: 174650112
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1005;
const int INF = 0x3f3f3f3f;
const long long LNF = 0x3f3f3f3f3f3f3f3f;
ll n, m;
ll i, j, k;
struct CAKE
{
ll a;
ll b;
ll c;
} cake[MAXN];

bool cmp(CAKE a, CAKE b)
{
return a.a * i + a.b * j + a.c * k > b.a * i + b.b * j + b.c * k;
}

int main()
{
cin >> n >> m;
for (i = 1; i <= n; i++)
cin >> cake[i].a >> cake[i].b >> cake[i].c;
ll ans = -LNF;
for (i = -1; i <= 1; i += 2)
for (j = -1; j <= 1; j += 2)
for (k = -1; k <= 1; k += 2)
{
sort(cake + 1, cake + n + 1, cmp);
ll tot[5] = {};
for (int l = 1; l <= m; l++)
{
tot[1] += cake[l].a;
tot[2] += cake[l].b;
tot[3] += cake[l].c;
}
ans = max(ans, tot[1] * i + tot[2] * j + tot[3] * k);
}
cout << ans << '\n';
return 0;
}