0
点赞
收藏
分享

微信扫一扫

Luogu P2534 [AHOI2012]铁盘整理


题目链接:​​传送门​​

很重要的一点是
一次翻转只会更改一对数的差值
因为他总是拿起最上面的几个圆盘
所以有几个数差值不为1就至少要翻转几次
这就有了可以估价的地方
算是一个简单的IDA*
题目保证铁板大小互不相同
所以需要离散化保证是1-n排列之后再搞

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <complex>
#include <algorithm>
#include <climits>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define
#define

using namespace std;
typedef long long ll;
pair<int, int> a[A];
int n, b[A];
void dfs(int dep, int st, int cnt = 0) {
for (int i = 2; i <= n; i++) if (abs(b[i] - b[i - 1]) != 1) cnt++;
if (cnt == 0 and b[1] < b[2]) {
cout << st << endl;
exit(0);
}
if (cnt + st > dep or st == dep) return;
for (int i = 2; i <= n; i++)
if (abs(b[i] - b[i + 1]) != 1) {
reverse(b + 1, b + i + 1);
dfs(dep, st + 1);
reverse(b + 1, b + i + 1);
}
}

int main(int argc, char const *argv[]) {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i].first, a[i].second = i;
sort(a + 1, a + n + 1); b[n + 1] = 0x3f3f3f3f;
for (int i = 1; i <= n; i++) b[a[i].second] = i;
for (int i = 1; ; i++) dfs(i, 0);
}


举报

相关推荐

0 条评论