您的位置:首页 > 其它

BZOJ2824 洛谷P2534 [AHOI2012]铁盘整理

2017-06-10 19:48 309 查看

题目描述:



输入输出格式

输入格式:

共两行。第一行为铁盘个数N(1<=N<=50),第二行为N个不同的正整数,分别为从上到下的铁盘的半径R。(1<=R<=100)

输出格式:

一个正整数,表示使铁盘从小到大有序需要的最少翻转次数。

输入输出样例

输入样例#1:

5

2 4 3 5 1

输出样例#1:

5

//本来这道题想刷一道排序的
//点开就是 搜索+剪枝
#include<cstdio>
#include<algorithm>
using namespace std;
struct Data{
int x,w;
bool operator < (Data b) const {
return x < b.x;
}
}a[55];
int n,ans;
inline void solve(int step,int tot){
if(tot==0&&a[1].x==1){
ans=min(ans,step);
return;
}
int cnt;
for(int i=2;i<=n;i++){
cnt=tot;
if(i<n)
cnt-=(abs(a[i].x-a[i+1].x)!=1)-(abs(a[1].x-a[i+1].x)!=1);
if(step+cnt<ans){
for(int j=1;j<=i/2;j++) swap(a[j],a[i-j+1]);
solve(step+1,cnt);
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",&a[i].x);
a[i].w=i;
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++)
a[a[i].w].x=i;
ans=n*2;
int tot=0;
for(int i=2;i<=n;i++)
tot += abs(a[i].x-a[i-1].x) != 1;
solve(0,tot);
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索