UVa 1611 (排序 模拟) Crane

假设数字1~i-1已经全部归位,则第i到第n个数为无序区间。

如果i在无序区间的前半段,那么直接将i换到第i个位置上。

否则先将i换到无序区间的前半段,再将i归位。这样每个数最多操作两次即可归位。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn = 10000 + 10;
 5 int a[maxn];
 6 vector<pair<int, int> > ans;
 7
 8 void op(int L, int R)
 9 {
10     ans.push_back(make_pair(L, 2*R-L-1));
11     int t = R - L;
12     for(int i = L; i < R; i++) swap(a[i], a[i+t]);
13 }
14
15 int main()
16 {
17     //freopen("in.txt", "r", stdin);
18
19     int T; scanf("%d", &T);
20     while(T--)
21     {
22         int n; scanf("%d", &n);
23         for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
24         ans.clear();
25         for(int i = 1; i < n; i++)
26         {
27             if(a[i] == i) continue;
28             int j;
29             for(j = i+1; j <= n; j++) if(a[j] == i) break;
30             if(j - i <= n - j + 1) op(i, j);
31             else
32             {
33                 int t = (n - i + 1) / 2;
34                 op(n-2*t+1, n-t+1);
35                 i--;
36             }
37         }
38         int sz = ans.size();
39         printf("%d\n", sz);
40         for(int i = 0; i < sz; i++) printf("%d %d\n", ans[i].first, ans[i].second);
41     }
42
43     return 0;
44 }

代码君

时间: 2024-10-17 15:20:47

UVa 1611 (排序 模拟) Crane的相关文章

UVA 712(二叉树模拟)

L - S-Trees Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Appoint description:  System Crawler  (2014-04-01) Description  S-Trees  A Strange Tree (S-tree) over the variable set  is a binary tree representing a B

NYOJ 179 LK&#39;s problem (排序模拟)

链接:click here~~ 题意: 描述 LK has a question.Coule you help her? It is the beginning of the day at a bank, and a crowd  of clients is already waiting for the entrance door to  open. Once the bank opens, no more clients arrive, and  tellerCount tellers be

acm集训训练赛B题【排序+模拟】

一.原题 Description Being a programmer, you like arrays a lot. For your birthday, your friends have given you an array a consisting of ndistinct integers. Unfortunately, the size of a is too small. You want a bigger array! Your friends agree to give you

zoj3780 Paint the Grid Again 拓扑排序模拟

比赛时候看完题目就觉得是拓扑排序,当时心里隐隐觉得跟相框叠加那个题有点相似的 然后wzy问我no solution 是什么情况,我就一直去想是不是构成了什么排列就一定是no solution 其实只用再参考相框叠加那个题往前想一丁点就够了,就是从最后涂的那一层开始往前找,每一次都必然有一行或一整列是一样的 每次按逆字母序删除这一行或列就是了. 拓扑排序的题总是类似而且简单的,找到关系,敲代码完全不存在问题. #include <iostream> #include <cstring>

Milking Cows 挤牛奶 USACO 排序 模拟

1005: 1.2.1 Milking Cows 挤牛奶 时间限制: 1 Sec  内存限制: 128 MB提交: 15  解决: 9[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 1.2.1 Milking Cows 挤牛奶 (milk2.pas/c/cpp) 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒.第二个农民在700秒开始,在 1200秒结束.第三个农民在1500秒开始2100秒结束.期间最长的至

UVa 11039 Building designing (贪心+排序+模拟)

题意:给定n个非0绝对值不相同的数,让他们排成一列,符号交替但绝对值递增,求最长的序列长度. 析:我个去简单啊,也就是个水题.首先先把他们的绝对值按递增的顺序排序,然后呢,挨着扫一遍,只有符号不同才计数,easy!!! 代码如下: #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; const int maxn = 5

Uva 1611 Crane

Thinking about it: 对于一个长度为N的序列,最大的数字为N,那么如果要将它放回到第N个位置,那么最多需要2步. 先用例子简单证明一下: 假设序列:1 2 3 6 5 4,当前最大数为6,需要和4交换位置,那么可以看作:* * * 6 * 4,因为6和4之间有一个数,而6之前有三个数,那么可以之间把6之后的部分,与6(包括)之前的     等长部分交换,可得 : 1 2 5 4 3 6,此时只需要一步,即可.   若如果,6之前的数 小于 6与4之间的数呢,如 1 6 2 3 4

UVa 1611 Crane (构造+贪心)

题意:给定一个序列,让你经过不超过9的6次方次操作,变成一个有序的,操作只有在一个连续区间,交换前一半和后一半. 析:这是一个构造题,我们可以对第 i 个位置找 i 在哪,假设 i  在pos 位置,那么如果 (pos-i)*2+i-1 <= n,那么可以操作一次换过来, 如果不行再换一种,如果他们之间元素是偶数,那么交换 i - pos,如果是奇数,交换 i - pos+1,然后再经过一次就可以换到指定位置. 代码如下: #pragma comment(linker, "/STACK:1

UVA 1611 Crane 起重机

题意:给一个1~n排列,1<=n<=10000,每次操作选取一个长度为偶数的连续区间.交换前一半和后一半,使它变成升序. 题解:每次只要把最小的移动到最左边,那么问题规模就缩小了.假设当前区间为[l,r],不难发现,只要最小的数字在[l,l+(r+1-l)/2]这个区间内,一定可以通过一次交换把最小的数字移动到l处,否则,先一定可以一次交换把最小的数字移动到上述区间中. #include<bits/stdc++.h> using namespace std; const int m