解题思路:

注意事项:

参考代码:#include<stdio.h>  
#include<stdlib.h>  
int main(){  
      int i,j,l,n,k,sum=0,flat=1,c=-1;
      char *a;
      scanf("%d",&n);
      a=(char *)malloc(n*sizeof(char));
      scanf("%s",a);
      j=n-1;  
       //利用贪心的思想,将每个遍历的字符找到后面与他相同的然后交换到正确的位置时所需的交换次数   
       for(i=0;i<j;i++){
           for(k=j;k>=i;k--){
               if(k==i){//说明没有找到与a[i]相同的字符   
                   if(n%2==0||c!=-1){//如果n为偶数或者a[i]不是唯一一个单个无相同字符   
                       flat=0;
                       break;
                   }
                   c=1;//n为奇数,将第一个单个的字符a[i]移到中间位置所需的交换次数   
                   sum=sum+n/2-i;
                   break;
               }
               if(a[k]==a[i]){
                   for(l=k;l<j;l++){  
                       a[l]=a[l+1];  
                   }  
                   a[j]=a[i];  
                   sum=sum+j-k;  
                   j--;  
                   break;  
               }  
           }  
           if(flat==0){
               break;
           }
       }  
       if(flat==0)
           printf("Impossible");
       else if(sum==0)
         printf("0");
     else
         printf("%d\n",sum);
     return 0;  
 }

点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论