hdu5500

来源:互联网 发布:淘宝货到付款是现金么 编辑:程序博客网 时间:2024/06/07 10:33

参考链接:官方题解

这道题,不知道为什么,凭直觉写出来后ac,(好神奇偷笑)后来看题解才明白证明:首先每个数如果挪的话最多挪一次,其次必须先挪大的再挪小的,最后如果一个数上面有比它的的数,则它一定要挪,否则,不必挪。所以找书的每种放置状态下,需要挪的最大的那个编号的数就可以了。

已ac的代码:

#include<stdio.h>#include<string.h>#include<iostream>using namespace std;#define N 25int order[N];int place[N];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;}


0 0
原创粉丝点击