基礎練習 完美的代價
時間限制:1.0s 內存限制:512.0MB
錦囊1
使用貪心算法。
錦囊2
從左到右枚舉每個字符,移動對應字符。個數為單的字符放中間。
問題描述
回文串,是一種特殊的字符串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你一個串,它不一定是回文的,請你計算最少的交換次數使得該串變成一個完美的回文串。
交換的定義是:交換兩個相鄰的字符
例如mamad
第一次交換 ad : mamda
第二次交換 md : madma
第三次交換 ma : madam (回文!完美!)
交換的定義是:交換兩個相鄰的字符
例如mamad
第一次交換 ad : mamda
第二次交換 md : madma
第三次交換 ma : madam (回文!完美!)
輸入格式
第一行是一個整數N,表示接下來的字符串的長度(N <= 8000)
第二行是一個字符串,長度為N.只包含小寫字母
第二行是一個字符串,長度為N.只包含小寫字母
輸出格式
如果可能,輸出最少的交換次數。
否則輸出Impossible
否則輸出Impossible
樣例輸入
5
mamad
mamad
樣例輸出
3
1 /* 2 完美的代價:通過交換相鄰字符,使原字符串化為回文字符串 。 3 */ 4 #include<stdio.h> 5 #include<stdlib.h> 6 int main(){ 7 int i,j,l,n,k,sum=0,flat=1,c=-1; 8 char *a; 9 scanf("%d",&n); 10 a=(char *)malloc(n*sizeof(char)); 11 scanf("%s",a); 12 j=n-1; 13 //利用貪心的思想,將每個遍歷的字符找到后面與他相同的然后交換到正確的位置時所需的交換次數 14 for(i=0;i<j;i++){ 15 for(k=j;k>=i;k--){ 16 if(k==i){//說明沒有找到與a[i]相同的字符 17 if(n%2==0||c!=-1){//如果n為偶數或者a[i]不是唯一一個單個無相同字符 18 flat=0; 19 break; 20 } 21 c=1;//n為奇數,將第一個單個的字符a[i]移到中間位置所需的交換次數 22 sum=sum+n/2-i; 23 break; 24 } 25 if(a[k]==a[i]){ 26 for(l=k;l<j;l++){ 27 a[l]=a[l+1]; 28 } 29 a[j]=a[i]; 30 sum=sum+j-k; 31 j--; 32 break; 33 } 34 } 35 if(flat==0){ 36 break; 37 } 38 } 39 if(flat==0) 40 printf("Impossible"); 41 else if(sum==0) 42 printf("0"); 43 else 44 printf("%d\n",sum); 45 return 0; 46 }
