1. 程式人生 > >1067 Sort with Swap(0, i) (25 分)貪心策略計算交換排序的最少次數

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 N (

1 0 5 ) N (≤10^5) 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;
} 

在這裡插入圖片描述

總結

  都說這道題是基於貪心策略的,但是我卻沒有發現哪一點體現貪心思想了,可能是我對貪心的理解不夠深吧。