UVA 1611 Crane 推理 貪心

2021-07-02 05:38:51 字數 875 閱讀 1770

解題思路:這句提示是關鍵,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。先判斷自己所選的區間是不是在所選範圍內,如果可以,則直接進行交換,如果不可以,則利用貪心的思想,使想要排序的值盡可能的靠近他的位置,注意這裡要判斷奇 偶...