51 nod 1574 排列轉換 思維 貪心

2021-08-08 04:06:38 字數 1086 閱讀 4412

1574 排列轉換

codeforces

基準時間限制:1 秒 空間限制:131072 kb 分值: 40 

難度:4級演算法題

現在有兩個長度為n的排列p和s。要求通過交換使得p變成s。交換 pi

和 pj

的代價是|i-j|。要求使用最少的代價讓p變成s。

input

單組測試資料。

第一行有乙個整數n (1≤n≤200000),表示排列的長度。

第二行有n個範圍是1到n的整數,表示排列p。每個整數只出現一次。

第三行有n個範圍是1到n的整數,表示排列s。每個整數只出現一次。

output

輸出乙個整數,表示從排列p變到s最少要多少代價。
input示例

樣例輸入1

44 2 1 3

3 2 4 1

output示例

樣例輸出1

3

將乙個數的首末位置相減除以2就是答案,(從移動的本質入手 巨集觀的觀察整個操作實質)因為每次移動兩個數,貪心的選取 通過移動使兩個數離目標位置都接近的 兩個數,為什麼一定可以找到,因為乙個數不在他的目標位置上 就一定有另乙個數也不在目標位置上 乙個數向左移動 另乙個數向右移動

#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

const int n = 200000+100;

typedef long long ll;

char str[n];

int p[n], s[n], id[n], pos[n], vis[n];

int main()

for(int i=1;i<=n;i++)

ll sum=0;

for(ll i=1;i<=n;i++)

}printf("%lld\n",sum/2);

return 0;

}

51nod 1574 排列轉換

現在有兩個長度為n的排列p和s。要求通過交換使得p變成s。交換 pi 和 pj 的代價是 i j 要求使用最少的代價讓p變成s。單組測試資料。第一行有乙個整數n 1 n 200000 表示排列的長度。第二行有n個範圍是1到n的整數,表示排列p。每個整數只出現一次。第三行有n個範圍是1到n的整數,表示...

51Nod 1574 排列轉換

現在有兩個長度為n的排列p和s。要求通過交換使得p變成s。交換 p i pi pi 和 p j pj pj 的代價是 i j 要求使用最少的代價讓p變成s。input單組測試資料。第一行有乙個整數n 1 n 200000 表示排列的長度。第二行有n個範圍是1到n的整數,表示排列p。每個整數只出現一次...

51nod 1574 排列轉換 貪心 鴿巢原理

題意 有兩個長度為n的排列p和s。要求通過交換使得p變成s。交換 pi 和 pj 的代價是 i j 要求使用最少的代價讓p變成s。考慮兩個數字pi和pj,假如交換他們能使得pi到目標的距離減少,pj到目標的距離減少。那麼應該交換他們,這是乙個必要的操作,也是答案的下界。如果每一次都能找到這樣的兩個數...