UVA6588 - Crane
来源:互联网 发布:阿里云资源编排 编辑:程序博客网 时间:2024/06/05 13:24
Regionals 2013 >>Europe - Central
6588 - Crane
题意:给定一组无序数,从1-n,要求排序,排序的要求是选定一个区间[a,b],则这个区间的前一半和后一半互换位置,a到b有偶数个数,问交换几次。
解题思路:由于数字个数不多,可以枚举1-n个位置,枚举第i个位置,就找到第i个点所在点的位置,如果可以直接交换就交换,如果不能就一半一半交换。
#include <stdio.h>#include <iostream>#include <string.h>#include <math.h>#include <algorithm>#include <stdlib.h>#include <queue>#include <vector>#include <map>using namespace std;const int inf = 0x3f3f3f3f;const int Max = 10100;typedef long long int LL;int a[Max],vis[Max], n, rr[531500], ll[531500];int cut;void exch(int l, int r){ int i, t; int mid = r-l; ll[cut] = l; rr[cut++] = r+mid-1; //printf("%d %d\n", l, r+mid-1); for(i = l; i < r; i++) { t = a[i]; a[i] = a[i+mid]; a[i+mid] = t; t = vis[a[i]]; vis[a[i]] = vis[a[i+mid]]; vis[a[i+mid]] = t; } /*for(i = 1; i <= n; i++) { cout<<a[i]<<" "; } cout<<endl;*/}int main(){ int i, pos, j; int K; scanf("%d", &K); while(K--) { scanf("%d",&n); cut = 0; for(i = 1; i <= n; i++) { scanf("%d",&a[i]); vis[a[i]] = i; } for(i = 1; i <= n; i++) { if(vis[i] == i) continue; pos = vis[i]; while(a[i] != i) { int end = i+(pos-i)*2-1; if(end <= n) { exch(i, pos); } else { int mid = pos - i +1; if(mid%2 == 0) { exch(i, i + mid/2); pos = vis[i]; } else { exch(i+1, i+mid/2+1); pos = vis[i]; } } } } printf("%d\n", cut); for(i = 0; i < cut; i++) { printf("%d %d\n", ll[i], rr[i]); } } return 0;}
0 0
- UVA6588 - Crane
- POJ2991--Crane
- poj crane
- poj2991 crane
- POJ_2991 Crane
- POJ2991-Crane
- UVA1611 Crane
- uva1611-Crane
- Crane UVA
- poj 2991 Crane
- POJ_2991 Crane 线段树
- POJ 2991 - Crane
- Crane(线段树)
- Crane(线段树)
- POJ 2991 Crane
- HDU 2991 Crane
- poj 2991-Crane
- UVa 1611 Crane
- 专利基本知识及撰写要求
- eclipse使用可能出现的问题(1.工作空间2.tomcat删除不能重建3导入项目报错)
- HDU 1540 Tunnel Warfare(另辟蹊径,c++ map 暴搜)
- error LNK2019: unresolved external symbol __atoi64
- 汉字站位符
- UVA6588 - Crane
- java jdbc学习整理一(基础)
- Linux 新环境安装JDK
- 转:蓝桥杯--历届试题 小朋友排队(树状数组求逆序数)
- 面向对象一______之继承、super和this的比较
- Socket与TCP/UDP编程
- Java温习——关键字和保留字
- eclipse 使用技巧
- Python:Scrapy中出现的乱码问题