真不想被一个个数据hack TwT
查看原帖
真不想被一个个数据hack TwT
398155
某kob在此楼主2024/11/19 20:09
  • 大小王不能当作对子但是可以王炸
  • 四个只能带两个不能只带一个

这好样的题目,还有什么奇葩的点啊才92

/*
11/19/2024

    我错把风云入墨,写尽一生都是错
    始终等不来一场雨淋湿你我
    那年你江南路过,我不该把月色惹
    便不会如此难以割舍
    我错把风云入墨,写尽一生都是错
    缘分难勾勒,在纸上,斑驳你我
    你转身远赴山河,恰如人间惊鸿客

    /////////////如听仙乐耳暂明//////////////
*/
#include<bits/stdc++.h>
using namespace std;

/*
1 17
7 3
4 2
5 2
10 1
10 3
3 3
13 4
4 4
7 2
0 2
4 1
13 3
7 4
4 3
10 4
5 4
0 1

00 3 4444 55 777 101010 1313
*/

int T, n, ans;
int p[55];

void dfs(int times, int k1, int k2, int k3){
    if (times >= ans)   return ;

    int kk = 0;
    //三顺子
    for (int i = 3; i <= 14; i ++){
        if (p[i] >= 3){
            kk ++;
            if (kk >= 2){
                for (int j = i; j >= i - kk + 1; j --) p[j] -= 3;
                dfs(times + 1, k1, k2, k3);
                for (int j = i; j >= i - kk + 1; j --) p[j] += 3;
            }
        }else   kk = 0;
    }
    kk = 0;
    //双顺子
    for (int i = 3; i <= 14; i ++){
        if (p[i] >= 2){
            kk ++;
            if (kk >= 3){
                for (int j = i; j >= i - kk + 1; j --) p[j] -= 2;
                dfs(times + 1, k1, k2, k3);
                for (int j = i; j >= i - kk + 1; j --) p[j] += 2;
            }
        }else   kk = 0;
    }
    kk = 0;
    //单顺子
    for (int i = 3; i <= 14; i ++){
        if (p[i] >= 1){
            kk ++;
            if (kk >= 5){
                for (int j = i; j >= i - kk + 1; j --) p[j] -= 1;
                dfs(times + 1, k1, k2, k3);
                for (int j = i; j >= i - kk + 1; j --) p[j] += 1;
            }
        }else   kk = 0;
    }

    //三带
    for (int i = 2; i <= 14; i ++){
        if (p[i] == 3){
            p[i] -= 3;
            dfs(times + 1, k1 + 1, k2, k3);
            dfs(times + 1, k1, k2 + 1, k3);
            p[i] += 3;
        }
    }
    //四带
    for (int i = 2; i <= 14; i ++){
        if (p[i] == 4){
            p[i] -= 4;
            dfs(times + 1, k1, k2, k3 + 2);
            dfs(times + 1, k1, k2 + 2, k3);
            p[i] += 4;
        }
    }

    //剩下的单牌(单和对)
    int r1 = p[0], r2 = 0;
    for (int i = 2; i <= 14; i ++){
        if (p[i] == 1)  r1 ++;
        if (p[i] >= 2)  r2 ++;
    }
    while (k3 >= 2 && r2 >= 2)  k3 -= 2, r2 -= 2;
    while (k3 >= 2 && r1 >= 2)  k3 -= 2, r1 -= 2;
    if (p[0] == 2 && r1 - k1 >= 2)  r1 --;

    ans = min(ans, times + max(r1 - k1, 0) + max(r2 - k2, 0));
}

int main(){
    cin >> T >> n;
    while (T --){
        memset(p, 0, sizeof(p));
        int kk; ans = n;
        for (int i = 1; i <= n; i ++){
            scanf("%d", &kk);
            if (kk == 1)    kk = 14;
            p[kk] ++;
            scanf("%d", &kk);
        }
        dfs(0, 0, 0, 0);
        // cout << "------------------------\n";
        cout << ans << endl;
        // cout << "------------------------\n";
    }

    return 0;
}
2024/11/19 20:09
加载中...