首页 > 其他分享 >CSP-S模拟19

CSP-S模拟19

时间:2022-10-16 19:11:29浏览次数:54  
标签:tmp 2ll 19 ll long 搭配 ans CSP 模拟

这两天好累,不想改题

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;
}

标签:tmp,2ll,19,ll,long,搭配,ans,CSP,模拟
From: https://www.cnblogs.com/wenqizhi/p/16796815.html

相关文章