解題思路:這句提示是關鍵,2n次操作,表明每個數最多只需要兩次操作。
應該從左到右依次操作過去,先將前面的數安定好了,就可以不用管前面的數了
假設操作到第i個位置,而i這個數剛好在pos這個位置上,現在就要判斷一下能否直接將pos上的i經過操作調到i這個位置上
如果 i + (pos - i) * 2 - 1 <= n 就表示可以一次操作完成
在上面條件不成立的情況下,又分為兩種情況
一種是pos和i的距離是奇數的情況:那麼就直接將[i,pos]這個區間的值進行交換即可
另一種是距離為偶數的情況,那就把[i+1,pos]這個區間的值進行交換即可
#include
#include
#include
#include
using
namespace
std;
typedef pair pair;
#define maxn 10010
int num[maxn];
void change(int l, int r)
int main()
if(pos == i)
continue;
if(i + 2 * (pos - i) - 1
<= n)
else
else
i--;}}
cout
<< ans.size() << endl;
for(int i = 0; i < ans.size(); i++)
printf("%d %d\n",ans[i].first, ans[i].second);
}return
0;}
UVA 1611 Crane(起重機)(貪心)
題意 輸入乙個1 n 1 n 10000 的排列,用不超過9 6次操作把它變成公升序。每次操作都可以選乙個長度為偶數的連續區間,交換前一半和後一半。分析 從左到右依次將數字i放在位置i。設要將數字i放在位置i,而數字i現在在位置pos。1 若 pos i 2 i 1 n,則可以直接將i放在位置i。p...
1 6 11 大整數減法
描述 求兩個大的正整數相減的差。輸入共2行,第1行是被減數a,第2行是減數b a b 每個大整數不超過200位,不會有多餘的前導零。輸出一行,即所求的差。樣例輸入 9999999999999999999999999999999999999 9999999999999樣例輸出 999999999999...
Crane UVA 1611 解題報告
思路 這道題要注意審題,因為人家沒說必須要求最簡,在規定次數內弄完就行。本來就是對的,因為感覺不是最簡,花裡胡哨改了乙個小時,看完題解崩潰了qaq。先判斷自己所選的區間是不是在所選範圍內,如果可以,則直接進行交換,如果不可以,則利用貪心的思想,使想要排序的值盡可能的靠近他的位置,注意這裡要判斷奇 偶...