zoukankan      html  css  js  c++  java
  • C语言 · 完美的代价

    基础练习 完美的代价  
    时间限制:1.0s   内存限制:512.0MB
          
    锦囊1
      使用贪心算法。
    锦囊2
      从左到右枚举每个字符,移动对应字符。个数为单的字符放中间。
     
    问题描述
      回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
      交换的定义是:交换两个相邻的字符
      例如mamad
      第一次交换 ad : mamda
      第二次交换 md : madma
      第三次交换 ma : madam (回文!完美!)
    输入格式
      第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
      第二行是一个字符串,长度为N.只包含小写字母
    输出格式
      如果可能,输出最少的交换次数。
      否则输出Impossible
    样例输入
    5
    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
    ",sum);
    45     return 0;  
    46 }
  • 相关阅读:
    js json 与字符串 转换过程由于书写不统一规范引发的一个问题
    asp.net 运行时,"未能映射路径"
    android html 图片处理类--加载富文本工具类
    System.Web.HttpCompileException (0x80004005): (0): error CS0016: 未能写入输出文件
    “请运行Chkdsk工具”怎么解决
    android studio新项目时提示:Plugin is too old, please update to a more recent version
    mvvm和mvc区别?
    什么是mvvm?
    js去除html标签
    数组的翻转(非reverse)
  • 原文地址:https://www.cnblogs.com/panweiwei/p/6478920.html
Copyright © 2011-2022 走看看