• 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 }
  • 相关阅读:
    HDU 3466(01背包变种
    HDU 2639(01背包第K大)
    POJ 2184(01背包)(负体积)
    UVA 562(01背包)
    UVA 624(01背包记录路径)
    SQL总结二
    oracle--知识点汇总1
    时间日期----java
    字符串、数值----转换
    字符串反转----示例
  • 原文地址:https://www.cnblogs.com/panweiwei/p/6478920.html
Copyright © 2020-2023  润新知