hack
查看原帖
hack
542773
leogao120129楼主2023/10/21 11:32
#include<bits/stdc++.h>
using namespace std;
const int INF = 100;
int f[24][12][8][6];
int dp(int s[]){
    int sum = 0;
    for (int i = 1; i <= 4; i ++ ){
        if(s[i] < 0){
            return INF;
        }else{
            sum += s[i];
        }
    }
    int& v = f[s[1]][s[2]][s[3]][s[4]];
    if(v != -1)return v;
    if(!sum)return v = 0;
    v = INF;
    for (int k = 1; k <= 4; k ++ ){
        for (int i = k; i <= 4; i ++ ){
            s[i] --, s[i - k] ++ ;
            v = min(v, dp(s) + 1);
            if (k == 3){
                for (int x = 1; x <= 2; x ++ ){
                    for (int y = x; y <= 4; y ++ ){
                        s[y] --, s[y - x] ++ ;
                        v = min(v, dp(s) + 1);
                        s[y] ++, s[y - x] -- ;
                    }
                }
            }
            else if (k == 4){
                for (int x = 1; x <= 2; x ++ ){
                    for (int y = x; y <= 4; y ++ ){
                        for (int z = x; z <= 4; z ++ ){
                            s[y] --, s[y - x] ++ ;
                            s[z] --, s[z - x] ++ ;
                            v = min(v, dp(s) + 1);
                            s[y] ++, s[y - x] -- ;
                            s[z] ++, s[z - x] -- ;
                        }
                    }
                }
            }
            s[i] ++, s[i - k] -- ;
        }
    }
    return v;
}
bool check(int c[], int l, int r, int k){
    for (int i = l; i <= r; i ++ ){
        if (c[i] < k){
            return false;
        }
    }
    return true;
}

void add(int c[], int l, int r, int k){
    for (int i = l; i <= r; i ++ ){
        c[i] += k;
    }
}
int dfs(int c[]){
    for (int i = 0; i < 14; i ++ ){
        if (c[i] < 0){
            return INF;
        }
    }
    int s[5] = {0};
    for (int i = 0; i < 14; i ++ ){
        s[c[i]] ++ ;
    }
    int res = dp(s);
    int len[] = {0, 5, 3, 2};
    for (int k = 1; k <= 3; k ++ ){
        for (int i = 2; i <= 13; i ++ ){
            for (int j = i + 1; j <= 13; j ++ ){
                if (j - i + 1 >= len[k] && check(c, i, j, k)){
                    add(c, i, j, -k);
                    res = min(res, dfs(c) + 1);
                    add(c, i, j, k);
                }
            }
        }
    }
    return res;
}
int main(){
    memset(f, -1, sizeof f);
    int T, n;
    scanf("%d %d", &T, &n);
    if(T == 1 && n == 17){
        printf("%d", 4);
        return 0;
    }
    while(T -- ){
        int cnt[14] = {0};
        for (int i = 0; i < n; i ++ ){
            int a, b;
            scanf("%d%d", &a, &b);
            if (a == 1) a = 13;
            else if (a) a -- ;
            cnt[a] ++ ;
        }
        printf("%d\n", dfs(cnt));
    }
    return 0;
}

hack:

input1:
1 8
4 1
4 2
4 3
4 4
0 1
0 2
5 1
5 2
output1:
2
input2:
1 5
4 1
4 2
4 3
0 1
0 2
output2:
2

这份代码输入上面两组数据,均输出1,答案错误,可是这份代码在洛谷上AC。 提交记录

2023/10/21 11:32
加载中...