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 }
  • 相关阅读:
    软件性能测试知识汇总
    软件功能测试知识汇总
    机器学习——KNN算法(k近邻算法)
    Shell脚本语法
    机器学习环境搭建及基础
    shell基础及变量
    查准率和召回率理解
    python中的矩阵、多维数组
    链表:反转链表
    栈和队列:生成窗口最大值数组
  • 原文地址:https://www.cnblogs.com/panweiwei/p/6478920.html
Copyright © 2011-2022 走看看