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;
}
这道题,不知道为什么,凭直觉写出来后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;
}
相关文章推荐
- 【小学生必学!】虚拟机安装系统,演示Ubuntu-server的安装
- 电脑启动后出现checking file system on c:
- 二维数组的介绍、遍历以及长度的计算
- unix学习笔记------消息队列---发送消息
- 猎豹上市(猎豹的广告收入中有70%来自BAT三家公司,总收入中有58%来自BAT)
- hdu5500
- 黑马程序员—————— Java集合框架Collection
- 杀人游戏(hdu2211)插入法
- [转]测试淘宝站内的搜索系统
- java网络---实现多线程下载文件
- 浅谈MDK环境下使用#include <stdio.h>的问题
- unix学习笔记------消息队列的接收
- 日经春秋 20151023
- Java学习路线图——及时纠正自己的学习方向
- Morris遍历
- javascript中的模式解析——原型模式
- 【bzoj1216】[HNOI2003]操作系统 堆+模拟
- java基础 设计模式2_结构型模式 简单总结
- loadrunner录制脚本时打不开IE解决办法
- 比spinner更轻量的下拉菜单——DropDownList控件