2 条题解

  • 1
    @ 2024-11-26 20:24:16
    #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;
    }
    

    信息

    ID
    97
    时间
    3000ms
    内存
    512MiB
    难度
    5
    标签
    递交数
    742
    已通过
    194
    上传者