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

提示:2n次操作就足够了。

分析:从左到右依次将数字i放在位置i。

设要将数字i放在位置i,而数字i现在在位置pos。

(1)若(pos - i) * 2 + i - 1 <= n,则可以直接将i放在位置i。pos-i为连续区间的一半长度,i-1为i之前已经排好的数字个数。交换连续区间(i, i + (pos - i) * 2 - 1)

如:1 3 4 2 5,将2放在位置2,现在1已经排好,只需交换连续区间(2,5),即将前一半3 4和后一半2 5交换,就可直接完成i放在位置i的操作。

(2)若不满足(1),则暂时将在pos位置的数字i向前交换,直至满足条件(1)。

操作为:若pos-i为奇数,则交换连续区间(i,pos);若pos-i为奇数,则交换连续区间(i+1,pos)。

#pragma comment(linker, "/STACK:102400000, 102400000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define Min(a, b) ((a < b) ? a : b)
#define Max(a, b) ((a < b) ? b : a)
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const double eps = 1e-8;
const int MAXN = 1e4 + 10;
const int MAXT = 10000 + 10;
using namespace std;
int a[MAXN];
vector<pair<int, int> > ans;
void exchange(int l, int r){
for(int i = l, j = l + (r - l + 1) / 2; j <= r; ++i, ++j){
swap(a[i], a[j]);
}
}
int main(){
int T;
scanf("%d", &T);
while(T--){
ans.clear();
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++i){
scanf("%d", &a[i]);
}
for(int i = 1; i <= n; ++i){
int pos = 0;
for(int j = i; j <= n; ++j){
if(a[j] == i){
pos = j;
break;
}
}
if(pos == i) continue;
if((pos - i) * 2 + i - 1 <= n){
ans.push_back(pair<int, int>(i, i + (pos - i) * 2 - 1));
exchange(i, i + (pos - i) * 2 - 1);
}
else{
if((pos - i) & 1){
ans.push_back(pair<int, int>(i, pos));
exchange(i, pos);
}
else{
ans.push_back(pair<int, int>(i + 1, pos));
exchange(i + 1, pos);
}
--i;
}
}
int len = ans.size();
printf("%d\n", len);
for(int i = 0; i < len; ++i){
printf("%d %d\n", ans[i].first, ans[i].second);
}
}
return 0;
}

 

UVA - 1611 Crane(起重机)(贪心)的更多相关文章

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

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

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

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

  3. UVA 1611 Crane

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

  4. uva 1611:Crane(构造 Grade D)

    题目链接 题意: 一个序列,你可以选择其中偶数长度的一段,然后中间切开,左右两段交换.现给你一个1~n的某个排列,求一个交换方案,使得排列最终有序.(交换次数 < 9^6) 思路: 从左到右,依 ...

  5. UVA - 1611 Crane (思路题)

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

  6. uva 1615 高速公路(贪心,区间问题)

    uva 1615 高速公路(贪心,区间问题) 给定平面上n个点和一个值D,要求在x轴上选出尽量少的点,使得对于给定的每个点,都有一个选出的点离它的欧几里得距离不超过D.(n<=1e5) 对于每个 ...

  7. UVa 1611 (排序 模拟) Crane

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

  8. Crane UVA - 1611 思路+构造

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

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

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

随机推荐

  1. coding 321

    三大原理(计算机原理.操作系统原理.编译原理)两个协议(TCP与HTTP协议)一种结构(数据结构)

  2. computed、methods、watch

    computed:计算属性将被混入到 Vue 实例中.所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例. methods:methods 将被混入到 Vue 实例中 ...

  3. question1 赋值运算操作符

    注意的问题书上讲的很详细了 下面是代码实现,但是VS有一个问题,strcpy安全性较低,虽然可以通脱编译,但是运行会报错,提示用strcpy_s()替代,但是,这里用strcpy()替代也不行, // ...

  4. 数据归一化Scaler-机器学习算法

    //2019.08.03下午#机器学习算法的数据归一化(feature scaling)1.数据归一化的必要性:对于机器学习算法的基础训练数据,由于数据类型的不同,其单位及其量纲也是不一样的,而也正是 ...

  5. 二十 Filter&自动登录功能

    Filter过滤器 过滤器,其实就是对客户端发出来的请求进行过滤,浏览器发出,然后服务器用Servelt处理.在中间就可以过滤,起到的是拦截的作用. 不仅仅作用于客户端请求,而且过滤服务器响应 作用: ...

  6. ObjectMapper : can only instantiate non-static inner class by using default, no-argument constructor

    Label_t lTrain = new ObjectMapper().readValue(s, Label_t.class); 因为Label_t是内部类,需要 1.static 2.无参构造函数

  7. JuJu团队1月3号工作汇报

    JuJu团队1月3号工作汇报 JuJu   Scrum 团队成员 今日工作 剩余任务 困难 飞飞 测试dataloader 将model嵌入GUI 无 婷婷 调试代码 提升acc 无 恩升 -- 写p ...

  8. NO25 三剑客之SED行天下

    功能说明 Sed是Stream Editor(流编辑器)缩写,是操作.过滤和转换文本内容的强大工具.常用功能有增删改查,过滤,取行. [root@oldboy ~]# sed --version #→ ...

  9. HTML学习第五天

    HTML学习第五天 今天学HTML的实体.背景.布局 HTML布局的标签基本被淘汰frameset就被淘汰了,只有iframe依然存活,但是iframe可以被CSS给代替.下面就是一个练习的程序 &l ...

  10. L2-012. 关于堆的判断(最小堆)

    将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: “x is the root”:x是根结点: “x and y are siblings”:x和y ...