这两天好累,不想改题
T1 木棍
题意:有 $ a_1 $ 个 $ 2 $ , $ a_2 $ 个 $ 3 $ , $ a_3 $ 个 $ 4 $ ,问最多能拼出多少个 $ 10 $
题解:首先有这么几种方案
$ 2 $ | $ 3 $ | $ 4 $ | |
---|---|---|---|
$ 1 $ | $ 5 $ | $ 0 $ | $ 0 $ |
$ 2 $ | $ 3 $ | $ 0 $ | $ 1 $ |
$ 3 $ | $ 2 $ | $ 2 $ | $ 0 $ |
$ 4 $ | $ 1 $ | $ 0 $ | $ 2 $ |
$ 5 $ | $ 0 $ | $ 2 $ | $ 1 $ |
一共 $ 5 $ 种方案
注意到 $ 2 $ 可以自己搭配,也可以和 $ 3 ,\ 4 $ 任意搭配
我们考虑先让 $ 3,\ 4 $ 搭配,然后再让他们分别和 $ 2 $ 搭配,最后让 $ 2 $ 自己搭配,按照使用 $ 2 $ 的数量从小到大排方案,这样可以最大化最后的答案
也就是上面的表格里,按照方案 $ 5, 4, 3, 2, 1 $ 的顺序搭配就可以啦
代码
#include<bits/stdc++.h>
#define ll long long
#define unsigned long long
#define register
using namespace std;
int T;
ll A, B, C;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> T;
while(T--)
{
cin >> A >> B >> C;
ll ans = 0;
// 3和4搭配 剩下的都是3和2,4和2搭配了
ll tmp = min(B / 2ll, C);
B -= tmp * 2ll;
C -= tmp;
ans += tmp;
// 2和4搭配,尽量多消耗4,少消耗2
tmp = min(A, C / 2ll);
A -= tmp;
C -= tmp * 2ll;
ans += tmp;
// 2和3搭配
tmp = min(A / 2ll, B / 2ll);
A -= tmp * 2ll;
B -= tmp * 2ll;
ans += tmp;
// 注意2和4搭配两种情况
if((C & 1) && A >= 3) --C, A -= 3, ++ans;
// 剩下的2自己配
ans += A / 5ll;
printf("%lld\n", ans);
}
return 0;
}