BZOJ2824: [AHOI2012]铁盘整理

显然到最终状态有一个下界,即为当前状态下,在最终状态中不相邻的相邻个数。

再加一些奇怪的剪枝就可以过了。另外这个题加强数据的题有剧毒。

#include <bits/stdc++.h>
using namespace std;
int b[60], a[60];
int pre, Ans;
int n;
int lim;
inline int check() {
    int ret = 0;
    for(int i = 1; i < n; ++ i) {
        if(abs(a[i] - a[i + 1]) != 1) ++ ret;
    }
    return ret + (a[n] != n);
}
inline void dfs(int now) {
    if(check() + now > lim) return;
    if(now == lim) {
        for(int i = 1; i <= n; ++ i) if(a[i] != i) return;
        printf("%d
", lim);
        exit(0);
    }
    for(int i = 2; i <= n; ++ i) if(a[i + 1] - a[i] != 1) {
        for(int j = 1; j <= i / 2; ++ j) {
            swap(a[j], a[i - j + 1]);
        }
        dfs(now + 1);
        for(int j = 1; j <= i / 2; ++ j) {
            swap(a[j], a[i - j + 1]);
        }
    }
}
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; ++ i) {
        scanf("%d", &b[i]);
    }
    for(int i = 1; i <= n; ++ i) {
        for(int j = 1; j <= n; ++ j) {
            if(b[j] <= b[i]) ++ a[i];
        }
    }
    Ans = 2 * n - 2;
    for(lim = 1; lim <= 2 * n - 2; ++ lim) {
        dfs(0);
    }
}
原文地址:https://www.cnblogs.com/iamqzh233/p/9427187.html