习题8-6 起重机(Crane, ACM/ICPC CERC 2013, UVa1611)
2017-12-29 11:39
507 查看
思路:
选择排序的思想,每个数最多经过两次翻转到达正确位置。
有点疑问:复杂度不是n方么。。。怎么能过。。。
选择排序的思想,每个数最多经过两次翻转到达正确位置。
有点疑问:复杂度不是n方么。。。怎么能过。。。
#include <set> #include <map> #include <ctime> #include <cmath> #include <stack> #include <queue> #include <deque> #include <cstdio> #include <string> #include <vector> #include <cctype> #include <sstream> #include <utility> #include <cstring> #include <cstdlib> #include <functional> #include <iostream> #include <algorithm> #define SF(a) scanf("%d", &a) #define PF(a) printf("%d\n", a) #define SFF(a, b) scanf("%d%d", &a, &b) #define SFFF(a, b, c) scanf("%d%d%d", &a, &b, &c) #define SFFFF(a, b, c, d) scanf("%d%d%d%d", &a, &b, &c, &d) #define CLEAR(a, b) memset(a, b, sizeof(a)) #define IN() freopen("in.txt", "r", stdin) #define OUT() freopen("out.txt", "w", stdout) #define FOR(i, a, b) for(int i = a; i < b; ++i) #define ALL(a) (a).begin(), (a).end() #define SZ(a) (int)(a).size() #define PB push_back #define LL long long #define mod 10007 #define inf 107 #define eps 1e-12 using namespace std; int buf[20]; int read() { int x = 0; char ch = getchar(); bool f = 0; while (ch < '0' || ch > '9') { if (ch == '-') f = 1; ch = getchar(); } while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar(); return f ? -x : x; } void write(int x) { if (!x) { putchar(48); return; } int l = 0; if (x < 0) putchar('-'), x = -x; while (x) buf[++l] = x % 10, x = x / 10; while (l) putchar(buf[l--] + 48); } //-------------------------chc------------------------------// const int maxn = 10005; int a[maxn]; int n; typedef pair<int, int> pii; int cnt; vector<pii> v; void debug() { FOR(i, 1, n + 1) printf("a = %d\n", a[i]); } void crane(int l, int r, int m) { cnt++; v.push_back(pii(l, r)); int num = (r - l + 1) / 2; FOR(i, 0, num) swap(a[l + i], a[m + i]); //printf("l = %d, r = %d, m = %d\n", l, r, m); //debug(); } int find(int cur) { int ret; FOR(i, cur, n + 1) if (a[i] == cur) { ret = i; break; } return ret; } void solve() { int cur = 1; while (cur <= n) { int pos = find(cur); if (pos == cur) { cur++; continue; } int l = cur, r = pos; if ((pos - cur + 1) & 1) l++; crane(l, r, (l + r + 1)/2); pos -= ((r - l + 1) / 2); if (pos == cur) { cur++; continue; } l = cur; r = pos + (pos - l - 1); crane(l, r, (l + r + 1)/2); cur++; } } int main() { //IN(); OUT(); int t = read(); while (t--) { v.clear(); cnt = 0; SF(n); FOR(i, 1, n + 1) SF(a[i]); solve(); PF(cnt); FOR(i, 0, SZ(v)) printf("%d %d\n", v[i].first, v[i].second); //debug(); } return 0; }
相关文章推荐
- 起重机(Crane ACMICPC CERC 2013 UVa1611)
- 习题8-6 起重机(Crane,ACM/ICPC CERC2013,UVa1611)
- UVA 1611 Crane 起重机 操作题 (2013 CE )
- 2013-2014 ACM ICPC Central European Regional Contest (CERC 13) I题Crane
- 习题7-1 消防车(Firetruck, ACM/ICPC World Finals 1991, UVa208)
- 算法竞赛入门经典-习题3-2 分子量(Molar Mass, ACM/ICPC Seoul 2007, UVa1586)
- UVA 12716 GCD XOR - ACM/ICPC Dhaka 2013
- 习题3-8 循环小数(Repeating Decimals, ACM/ICPC World Finals 1990, UVa202)
- UVA 514 Rails - ACM/ICPC CERC 1997
- 【数论】GCD XOR, ACM/ICPC Dhaka 2013, UVa12716 【异或】【好题】
- 习题3-1 得分(Score, ACM/ICPC Seoul 2005, UVa 1585)
- Rails,ACM/ICPC CERC 1997,UVa514
- 习题3-3 数数字(Digit Counting , ACM/ICPC Danang 2007, UVa1225)
- 例题6-2 铁轨(Rails, ACM/ICPC CERC 1997, UVa 514)
- 习题5-2 Ducci序列(Ducci Sequence, ACM/ICPC Seoul 2009, UVa1594)
- 2013-2014 ACM ICPC Central European Regional Contest (CERC 13) K题(dp)
- UVa806 习题6-8 空间结构(Spatial Structures,ACM/ICPC World Finals 1998)
- 习题3-2 分子量(Molar Mass, ACM/ICPC Seoul 2007, UVa1586)
- 习题7-4 切断圆环链(Cutting Chains, ACM/ICPC World Finals 2000, UVa818)
- UVA 1611 Crane 起重机 (子问题)