码迷,mamicode.com
首页 > 编程语言 > 详细

UVa 1611 (排序 模拟) Crane

时间:2015-04-12 21:02:46      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:

假设数字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 }
代码君

 

UVa 1611 (排序 模拟) Crane

标签:

原文地址:http://www.cnblogs.com/AOQNRMGYXLMV/p/4420382.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!