题目链接

题意:

一个序列,你可以选择其中偶数长度的一段,然后中间切开,左右两段交换。现给你一个1~n的某个排列,求一个交换方案,使得排列最终有序。(交换次数 < 9^6)

思路:

从左到右,依次把一个个数放到位。把一个数放到正确的位置,观察发现最多两步。第i个数,若现在的位置在 [i+1, (n+i)/2] 内,则可以一次到位。若在它右边,则可以通过一次,使得其到这个范围内。

代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cassert>
#include <algorithm>
using namespace std;
#define N 10100 int a[N];
int id[N];
int n; struct Ans{
int l, r;
Ans(int _l=, int _r =) : l(_l), r(_r){}
}ans[*N];
int ap; void myswap(int l, int r) {
ans[ap++] = Ans(l,r);
//printf("l = %d, r = %d\n", l, r);
assert((r-l+)% == );
int mid = (l+r)/;
int lp = l;
int rp = mid+;
while (lp <= mid) {
swap(id[a[lp]], id[a[rp]]);
swap(a[lp], a[rp]);
lp++; rp++;
} //puts("after---");
//for (int i = 0; i < n; i++) {
// printf("%d ", a[i]+1);
//}puts("");
} int main() {
int t;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
for (int i = ; i < n; i++) {
scanf("%d", &a[i]);
a[i]--;
}
for (int i = ; i < n; i++) {
id[a[i]] = i;
} ap = ;
for (int i = ; i < n; i++) {
if (id[i] == i) continue; int flag = (n+i)/;
if (id[i] > flag) {
myswap( flag - (id[i]-flag-) ,id[i] );
}
//printf("i = %d, swap(%d->%d)\n", i, i, id[i]+(id[i]-i-1));
myswap(i, id[i] + (id[i]-i-));
}
//for (int i = 0; i < n; i++) {
// printf("%d ", a[i]);
//}puts(""); printf("%d\n", ap);
for (int i = ; i < ap; i++) {
printf("%d %d\n", ans[i].l+, ans[i].r+);
}
}
return ;
}

uva 1611:Crane(构造 Grade D)的更多相关文章

  1. UVa 1611 Crane (构造+贪心)

    题意:给定一个序列,让你经过不超过9的6次方次操作,变成一个有序的,操作只有在一个连续区间,交换前一半和后一半. 析:这是一个构造题,我们可以对第 i 个位置找 i 在哪,假设 i  在pos 位置, ...

  2. Crane UVA - 1611 思路+构造

    题目:题目链接 思路:思路+构造,假设 i  在pos 位置,那么如果 (pos-i-1)*2+i+1 <= n,那么可以操作一次换过来,如果他们之间元素个数是偶数,那么交换 i - pos,如 ...

  3. UVA 1611 Crane

    题意: 输入一个1-n的排列,要求经过操作将其变换成一个生序序列.操作的规则如下每次操作时,可以选一个长度为偶数的连续区间,交换前一半和后一半. 分析: 假设操作到第i个位置,而i这个数刚好在pos这 ...

  4. UVA 1611 Crane 起重机 (子问题)

    题意:给一个1~n排列,1<=n<=10000,每次操作选取一个长度为偶数的连续区间.交换前一半和后一半,使它变成升序. 题解:每次只要把最小的移动到最左边,那么问题规模就缩小了.假设当前 ...

  5. UVA - 1611 Crane (思路题)

    题目: 输入一个1~n(1≤n≤300)的排列,用不超过96次操作把它变成升序.每次操作都可以选一个长度为偶数的连续区间,交换前一半和后一半.输出每次操作选择的区间的第一个和最后一个元素. 思路: 注 ...

  6. 紫书 习题8-6 UVa 1611 (构造法)

    这道题和例题8-1相当的像. 例题8-1https://blog.csdn.net/qq_34416123/article/details/80112017 一开始我还以为用归并的思想, 用交换把局部 ...

  7. UVA - 1611 Crane(起重机)(贪心)

    题意:输入一个1~n(1<=n<=10000)的排列,用不超过9^6次操作把它变成升序.每次操作都可以选一个长度为偶数的连续区间,交换前一半和后一半. 提示:2n次操作就足够了. 分析:从 ...

  8. UVa 1611 (排序 模拟) Crane

    假设数字1~i-1已经全部归位,则第i到第n个数为无序区间. 如果i在无序区间的前半段,那么直接将i换到第i个位置上. 否则先将i换到无序区间的前半段,再将i归位.这样每个数最多操作两次即可归位. # ...

  9. 【习题 8-6 UVA - 1611】 Crane

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 想把数字i从位置j移动到位置i 可以这样. 假设mov(x,y)表示将(x..x+len/2-1)和(x+len/2..y)交换. ...

随机推荐

  1. jquery 省市区联动插件

    使用方式: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  2. python3.7 装饰器

    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 装饰器 #装饰器 ''' 定义:本质就是一个函数,作用是为其他函 ...

  3. FLASH、SDRAM

    1.flash: 闪存,掉电之后里面的存储数据不会丢失,在嵌入式系统中用作存储Bootloader以及操作系统或者程序代码或者直接当硬盘使用(U盘).一般主要使用的FLASH有NOR flash和NA ...

  4. B - Sonya and Exhibition CodeForces - 1004B (思维题)

    B. Sonya and Exhibition time limit per test 1 second memory limit per test 256 megabytes input stand ...

  5. 【Decode Ways】cpp

    题目: A message containing letters from A-Z is being encoded to numbers using the following mapping: ' ...

  6. 设计模式学习笔记——java中常用的设计模式

    单例设计模式(Singleton Pattern) 观察者模式(Observer Pattern) 工厂模式(Factory Pattern) 策略模式(Strategy Pattern) 适配器模式 ...

  7. IOS开发学习笔记033-UIScrollView

    1.滚动显示图片 如果图片过大,则需要滚动显示,这是需要用到类UIScrollView,可是实现控件的水平和垂直滚动. 可用三步实现:1 设置UIScrollView,2 设置UIImageView, ...

  8. ubuntu16.04中docker安装curl拒绝连接问题

    在Ubuntu16.04中安装docker ce,安装步骤按照官网说明https://docs.docker.com/engine/installation/linux/docker-ce/ubunt ...

  9. sqlserver执行时间和自行效率

    SET STATISTICS PROFILE ON --SET STATISTICS IO ON --SET STATISTICS TIME ON declare @dtm datetime SQL语 ...

  10. Unity 脚本<1>

    RaycastHit2D hit = Physics2D.Linecast(targetPosition, targetPosition + new Vector2(x, y)); 猜测是lineca ...