1067 Sort with Swap(0, i) (25 分)貪心策略計算交換排序的最少次數
題目
Given any permutation of the numbers {0, 1, 2,…, N−1}, it is easy to sort them in increasing order. But what if Swap(0, *) is the ONLY operation that is allowed to use? For example, to sort {4, 0, 2, 1, 3} we may apply the swap operations in the following way:
Swap(0, 1) => {4, 1, 2, 0, 3}
Swap(0, 3) => {4, 1, 2, 3, 0}
Swap(0, 4) => {0, 1, 2, 3, 4}
Now you are asked to find the minimum number of swaps need to sort the given permutation of the first N nonnegative integers.
Input Specification:
Each input file contains one test case, which gives a positive
followed by a permutation sequence of {0, 1, …, N−1}. All the numbers in a line are separated by a space.
Output Specification:
For each case, simply print in a line the minimum number of swaps need to sort the given permutation.
Sample Input:
10
3 5 7 2 6 4 9 0 8 1
Sample Output:
9
解題思路
題目大意: 給你一個亂序的序列(permutation ),從0到N-1,順序打亂。下面給你一種交換排序的演算法:每次交換隻能和元素0進行交換,交換一定次數之後,達到升序。請問最小的交換次數。
解題思路: 題目限定只能和0元素交換,且要達到最小交換次數。所謂最小交換次數,我們務必保證每一次交換都是最有效率的,如何才算是最有效率呢?一次交換確定一個元素的最終位置。
因為每次交換都要用到0元素,不妨把0元素作為一個運載體,每交換一次,0元素把一個元素送到最終位置。
那麼不妨考慮從0到N-1開始遍歷,每次考察第i個元素是否在自己位置上,如果在,則跳過,如果不在,則用0元素與其交換;
交換之前,考察0元素所指向的位置,如果0元素不在0號位置上,那麼先把佔用0號位置的其他元素送回到自己該處的位置;
0號元素已經迴歸到自己的位置上時,再送第i號元素回第i號位置;
由於每次都要用到0號元素和0號位置,所以遍歷可以從1開始,而不是0.
/*
** @Brief:No.1067 of PAT advanced level.
** @Author:Jason.Lee
** @Date:2019-01-07
** @Solution: Accepted!
*/
#include<iostream>
using namespace std;
int number[100010];
int main(){
int N;
while(cin>>N){
int input,swapTimes = 0;
for(int i=0;i<N;i++){
cin>>input;
number[input] = i;
}
for(int i=0;i<N;i++){
if(number[i]!=i){
while(number[0]!=0){
swap(number[0],number[number[0]]);
swapTimes++;
}
}
if(number[i]!=i){
swap(number[0],number[i]);
swapTimes++;
}
}
cout<<swapTimes<<endl;
}
return 0;
}
總結
都說這道題是基於貪心策略的,但是我卻沒有發現哪一點體現貪心思想了,可能是我對貪心的理解不夠深吧。