可以被很多数据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;
}