社区讨论

迷之全T

P2668[NOIP 2015 提高组] 斗地主参与者 7已保存回复 13

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
13 条
当前快照
1 份
快照标识符
@mi6lu0eg
此快照首次捕获于
2025/11/20 06:59
4 个月前
此快照最后确认于
2025/11/20 07:01
4 个月前
查看原帖
CPP
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <ctime>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <map>
#define ll long long
#define SYS sys tem("pause")
using std :: min;

int card[14], ans;

void to_array(int a[], ll x) {
    for(int i = 0; i < 14; i++) {
        a[i] = x % 10;
        x /= 10;
    }
}
ll to_num(int a[]) {
    ll num = 0, num_ = 1;
    for(int i = 0; i < 14; i++, num_ *= 10) {
        if(a[i])    num += num_ * a[i];
    }
    return num;
}
void to_cnt(int a[], ll x) {
    memset(a, 0, sizeof(a));
    while(x > 0) {
        if(x % 10)    a[x%10-1] ++;
        x /= 10;
    }
}

int cal(ll x) {
    int a[4], times = 0;
    to_cnt(a, x);
    while(a[3]) {
        a[3]--;
        if(a[0] >= 2)    a[0] -= 2;
        else if(a[1] >= 2)    a[1] -= 2;
        else if(a[1])    a[1] --;
        else if(a[2]) {
            if(a[0]) {
                a[2] --;    a[0] --;    a[1] ++;
            } else {
                a[2] --;    a[0] ++;
            }
        }
        else if(a[3])    a[3]--;
        times ++;
    }
    while(a[2]) {
        a[2] --;
        if(a[0])    a[0] --;
        else if(a[1])    a[1] --;
        times ++;
    }
    times += a[0]+a[1];
    return times;
}

void dfs(ll x, int cnt) {
    int a[14];
    to_array(a, x);
    for(int k = 1; k <= 3; k++) {
        bool flag = 0;
        for(int i = 0; i < 12; i++) {
            if(a[i] >= k) {
                ll num = pow(10, i) * k, num_ = num;
                for(int j = i+1; j < 12; j++) {
                    if(a[j] < k) {
                        if(j < i+5) {
                            i = j;
                        }
                        break;
                    } else {
                        num = num * 10 + num_;
                        if(j >= i+4) {
                            dfs(x-num, cnt+1);
                            flag = true;
                        }
                    }
                }
            }
        }
        if(!flag)    break;
    }
    ans = min(ans, cnt+cal(x));
}

int main() {
    int T, n;
    scanf("%d %d", &T, &n);
    while(T--) {
        memset(card, 0, sizeof(card));
        ans = n;
        int a, b;
        for(int i = 0; i < n; i++) {
            scanf("%d %d", &a, &b);
            if(a == 0)    card[13] ++;
            else if(a < 3)    card[a+10] ++;
            else    card[a-3] ++;
        }
        dfs(to_num(card), 0);
        printf("%d\n", ans);
    }
    return 0;
}

回复

13 条回复,欢迎继续交流。

正在加载回复...