IDA*求助qaq
查看原帖
IDA*求助qaq
90036
buaa_czx楼主2023/8/1 16:24

可以被很多数据hack,但不知道问题出在哪。 如果把去重的set删掉,则会大TLE,但是为什么题解的暴力IDA能过啊

随便给出一组:

9
4 7 6 5 1 9 3 8 2
9
1 5 7 2 3 6 4 8 9
0
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define ll long long
#define ull unsigned long long
#define endl '\n'
#define pr printf
#define sc scanf
#define scd(x) scanf("%d", &(x))
#define scdd(x, y) scanf("%d%d", &(x), &(y))
#define scddd(x, y, z) scanf("%d%d%d", &(x), &(y), &(z))
#define scdddd(x, y, z, u) scanf("%d%d%d%d", &(x), &(y), &(z), &(u))
#define scs(s) scanf("%s", s)
#define scss(s1, s2) scanf("%s%s", s1, s2)
#define frein(s) freopen(s, "r", stdin)
#define freout(s) freopen(s, "w", stdout)
#define mem(a, k) memset(a, k, sizeof(a))
#define int ll
#define rep(i, a, b) for (ll i = (a); i <= (b); i++)
#define per(i, a, b) for (ll i = (a); i >= (b); i--)
#define cf                                                                     \
    int _;                                                                     \
    cin >> _;                                                                  \
    while (_--) {                                                              \
        solve();                                                               \
    }
#define ios                                                                    \
    ios::sync_with_stdio(false);                                               \
    cin.tie(0);                                                                \
    cout.tie(0);
const int INF = 0x3f3f3f3f;
const double eps = 1e-10;
int _, n, a[11], maxd;
unordered_set<ll> s;
ll my_hash() {
    ll res = 0;
    rep(i, 1, n) res = res * 10 + a[i];
    return res;
}
int unord() {
    int res = 0;
    rep(i, 2, n) {
        if (a[i] != a[i - 1] + 1)
            res++;
    }
    return res;
}
void my_move(int l, int r, int posi) {
    int tmp[11];
    memcpy(tmp, a, sizeof(a));
    for (int i = posi, j = l; i <= posi + r - l; i++, j++) {
        a[i] = tmp[j];
    }
    int j = 1;
    rep(i, 1, n) {
        if (i >= posi && i <= posi + r - l)
            continue;
        while (j >= l && j <= r)
            j++;
        a[i] = tmp[j++];
    }
    return;
}
bool dfs(int d) {
    if (d == maxd) {
        if (unord() == 0) {
            return 1;
        }
        return 0;
    }
    if (3 * (maxd - d + 1) < unord())
        return 0;
    bool ok = 0;
    int tmp[11];
    memcpy(tmp, a, sizeof(tmp));
    rep(l, 1, n) {
        if (a[l] == a[l - 1] + 1)
            continue;
        rep(r, l, n) {
            if (a[r] == a[r + 1] - 1)
                continue;
            rep(posi, 1, n - (r - l)) {
                my_move(l, r, posi);
                if (s.count(my_hash())) {
                    memcpy(a, tmp, sizeof(tmp));
                    continue;
                }
                s.insert(my_hash());
                if (dfs(d + 1))
                    return 1;
                memcpy(a, tmp, sizeof(tmp));
            }
        }
    }
    return 0;
}
signed main() {
    ios;
    while (++_ && cin >> n && n != 0) {
        rep(i, 1, n) cin >> a[i];
        for (maxd = 0; maxd <= 9; maxd++) {
            //   cout << maxd << endl;
            s.clear();
            if (dfs(0)) {
                cout << "Case " << _ << ": ";
                cout << maxd << endl;
                break;
            }
        }
    }
    return 0;
}
2023/8/1 16:24
加载中...