P11323 【MX-S7-T1】「SMOI-R2」Happy Card
P11323 【MX-S7-T1】「SMOI-R2」Happy Card - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这题不复杂,本质就是一个贪心,可以发现,三带一和炸弹可以合并为三个相同的带任意一张牌。那我们尽量都选三张相同的,这样每种牌最后只剩 \(0,1,2\) 张牌,我们先用三张带走尽量带走只剩 1 张的牌,如果还有多的三张,就去不断带只剩 2 张的(花费两个三张),如果两张带完还有剩的,用三带自己带自己,
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 300010;
int n, m;
int g[N];
LL t[3];
int read()
{
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
{
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
x = x * 10 + ch - '0', ch = getchar();
return x * f;
}
int main()
{
int T;
cin >> T;
while (T -- )
{
cin >> n;
memset(t, 0, sizeof t);
LL cnt = 0; // 三带的数量(三张相同)
for (int i = 1; i <= n; i ++ )
{
g[i] = read();
cnt += g[i] / 3;
t[g[i] % 3] ++ ;
}
if (t[1] > cnt) cout << t[1] - cnt + cnt + t[2] << endl; // 带不走全部1
else
{
if ((cnt - t[1]) / 2 >= t[2]) // 还能带走2
{
LL x = cnt - t[1] - 2 * t[2]; // 剩余三带数量
LL sum = t[1] + 2 * t[2] + x * 3 / 4; // x * 3 / 4是三带带自己
if (x * 3 % 4 == 3) sum += 2; // 带完还剩三张相同,(不能直接输出三张相同),就分为一个单牌和一个对子
else if (x * 3 % 4 == 2 || x * 3 % 4 == 1) sum ++ ; // 直接输出对子/单牌
cout << sum << endl;
} // 带不走2
else cout << cnt + t[2] - (cnt - t[1]) / 2 << endl;
} // (cnt - t[1]) / 2 是还能带走2的的数量
}
return 0;
}