您的位置:首页 > 其它

hdu5500

2015-10-23 21:46 162 查看
参考链接:官方题解

这道题,不知道为什么,凭直觉写出来后ac,(好神奇

)后来看题解才明白证明:首先每个数如果挪的话最多挪一次,其次必须先挪大的再挪小的,最后如果一个数上面有比它的的数,则它一定要挪,否则,不必挪。所以找书的每种放置状态下,需要挪的最大的那个编号的数就可以了。

已ac的代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define N 25

int order
;
int place
;
int n;

int dfs(){
for(int i=n-1;i>=1;i--){
if(place[i]>place[i+1]){
for(int j=place[i]-1;j>=1;j--){
order[j+1]=order[j];
}
order[1]=i;

for(int i=1;i<=n;i++){
place[order[i]]=i;
}

return dfs()+1;
}
}

return 0;
}

int main(){
int t;

scanf("%d",&t);
while(t--){
scanf("%d",&n);

for(int i=1;i<=n;i++){
scanf("%d",&order[i]);
place[order[i]]=i;
}

printf("%d\n",dfs());
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: