Sorting by Swapping |
Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB |
Total submit users: 110, Accepted users: 104 |
Problem 10067 : No special judgement |
Problem description |
Given a permutation of numbers from 1 to n, we can always get the sequence 1, 2, 3, ..., n by swapping pairs of numbers. For example, if the initial sequence is 2, 3, 5, 4, 1, we can sort them in the following way: 2 3 5 4 1 1 3 5 4 2 1 3 2 4 5 1 2 3 4 5 Here three swaps have been used. The problem is, given a specific permutation, how many swaps we needs to take at least. |
Input |
The first line contains a single integer t (1 <= t <= 20) that indicates the number of test cases. Then follow the t cases. Each case contains two lines. The first line contains the integer n (1 <= n <= 10000), and the second line gives the initial permutation. |
Output |
For each test case, the output will be only one integer, which is the least number of swaps needed to get the sequence 1, 2, 3, ..., n from the initial permutation. |
Sample Input |
2 3 1 2 3 5 2 3 5 4 1 |
Sample Output |
0 3 |
Problem Source |
Beijing 2005 Warmup |
#include <stdio.h>
#define MAX 10000
#define RIGHT 1
#define WRONG 0
main()
{
int total=0,n=0,num[MAX],min=0;
int i=0,j=0,k=0,p=0,count=0;
int flag,start;
scanf("%d",&total);
for( k = 0 ; k < total ; k++ ){
count = 0 ;
scanf("%d",&n);
for( p = 0 ; p < n ; p++)scanf("%d",&num[p]);
//for( p = 0 ; p < n ; p++)printf("num%d ",num[p]);
for( i = 0 ; i < n ; i++){
if( num[i] != i+1 ){
start = i;
flag = WRONG;
while( flag != RIGHT ){
for( j = 0 ; j < n ; j++ ){
if( num[j] == start + 1 ){
num[j] = num[start];
num[start] = start +1;
count++;
start = j;
break;
}
}
if( num[start] == start+1 )flag = RIGHT;
else flag = WRONG;
}//while
}
}
printf("%d ",count);
}
return 0;
}
#define MAX 10000
#define RIGHT 1
#define WRONG 0
main()
{
int total=0,n=0,num[MAX],min=0;
int i=0,j=0,k=0,p=0,count=0;
int flag,start;
scanf("%d",&total);
for( k = 0 ; k < total ; k++ ){
count = 0 ;
scanf("%d",&n);
for( p = 0 ; p < n ; p++)scanf("%d",&num[p]);
//for( p = 0 ; p < n ; p++)printf("num%d ",num[p]);
for( i = 0 ; i < n ; i++){
if( num[i] != i+1 ){
start = i;
flag = WRONG;
while( flag != RIGHT ){
for( j = 0 ; j < n ; j++ ){
if( num[j] == start + 1 ){
num[j] = num[start];
num[start] = start +1;
count++;
start = j;
break;
}
}
if( num[start] == start+1 )flag = RIGHT;
else flag = WRONG;
}//while
}
}
printf("%d ",count);
}
return 0;
}