zoukankan      html  css  js  c++  java
  • uva1611 Crane

    类似煎饼,先把1放到1,之后是子问题   (先放到前一半,再放到开头,两次操作)(任何位置,最多一次就可以放到前一半))

    #include<iostream>
    #include<vector>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    
    int a[10010];
    
    void change(int l,  int r){
        for(int i = l, j = l+(r-l)/2+1; j <= r; ++i, ++j)
            swap(a[i], a[j]);
    }
    
    vector<pair<int, int>> Road;
    int n;
    int main(){
        int T; cin >> T;
        while (T--){
            cin >> n;
            Road.clear();
            for(int i = 0; i < n; ++i) cin >> a[i];  //计算到i时,前面的位置已经排好了
            for(int i = 0; i < n; ++i){
                int pos = find(a, a + n, i + 1) - a;
                if(pos == i) continue;
                if(i + 2*(pos-i) <= n){   //i+1可以直接交换到i位置(后面有足够的数,不越界)
                    Road.push_back(make_pair(i+1, i + 2*(pos-i)));
                    change(i, i + 2*(pos-i) - 1);
                }
                else{                    //交换到前一半
                    if((pos-i)%2){  //偶数个
                        Road.push_back(make_pair(i+1, pos + 1));
                        change(i, pos);
                    }
                    else{
                        Road.push_back(make_pair(i+2, pos + 1));
                        change(i + 1, pos);
                    }
                    --i;
                }
            }
            cout << Road.size() << endl;
            for(long long i=0;i<Road.size();i++) printf("%d %d
    ", Road[i].first, Road[i].second);
        }
        return 0;
    }
  • 相关阅读:
    蚂蚁问题
    LinuxC安装gcc
    怎样在VC里面使用graphics.h绘图
    C语言之固定格式输出当前时间
    C语言之猜数字游戏
    C语言之新同学年龄
    C语言之ASCII码
    C语言之辗转相除法
    C语言之自守数
    C语言之一数三平方
  • 原文地址:https://www.cnblogs.com/lqerio/p/9745561.html
Copyright © 2011-2022 走看看