题意:输入一个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. [LuoguP1203][USACO1.1]P1203 Broken Necklace

    Solution 这道题数据规模奇小,因此大部分人都使用了暴力搜索的方法,这也是我一开始的想法. 对于 100100%100 的数据,3≤n≤3503≤n≤3503≤n≤350 的确可以如此,但暴力搜 ...

  2. Maven 使用Nexus搭建Maven私服

    Maven学习 (四) 使用Nexus搭建Maven私服 为什么要搭建nexus私服,原因很简单,有些公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找 ...

  3. IntelliJ如何设置自动导包

    idea 关于自动导包的设置 标签: idea 2016-09-30 18:10 400人阅读 评论(0) 收藏 举报 本文章已收录于: .embody{ padding:10px 10px 10px ...

  4. 图解IDEA中配置Maven并创建Maven的Web工程

    打开IDEA,File->Settings,如下图所示: 2.在Settings中按照如下进行配置,如下图所示:

  5. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:自适应大小的按钮组

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. 判断ES数据是否更新成功

    参考:https://stackoverflow.com/questions/38928991/how-to-detect-if-a-document-update-in-elasticsearch- ...

  7. LR_问题_平均响应时间解释,summary与analysis不一致----Summary Report中的时间说明

    Summary是按整个场景的时间来做平均的,最大最小值,也是从整个场景中取出来的. (1)       平均响应时间:事物全部响应时间做平均计算 (2)       90%响应时间:将事物全部响应时间 ...

  8. P1067 试密码

    P1067 试密码 转跳点:

  9. dubbo-admin的安装使用

    dubbo-admin下载地址:https://github.com/apache/incubator-dubbo/releases 可以直接下载到linux上 wget https://github ...

  10. 027、Java中的转义字符

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...