贪心

题目:

  • Problem Description
  • 某天,jq突发奇想,想到了这么一道水题。
  • 给定一个由字母组成的字符串S,将其排序为回文串。
  • 推荐使用scanf
  • gets会读到行末的\r,因为是在windos在造的数据
  •  
  • Input
  • 多组测试数据
  • 每组数据第一行包含一个字符串S。
  • 1<=strlen(S)<=10000
  •  
  •  
  • (样例已修改,对不起大家了)
  •  
  • Output
  • 输出重新排序后,字典序最小(按ASCII码的大小)的回文串,若无法排序为回文串,则输出"Impossible"。
  •  
  •  
  •  
  • SampleInput
  •  
  • aBaB abc
  •  
  • SampleOutput
  •  
  • BaaB Impossible

此水题,不发博客,天理难容!

  1.  
  2. #include<cstdio>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<cstring>
  6. #include<sstream>
  7. typedef long long ll;
  8. using namespace std;
  9. const int maxn=10000+10;
  10. const int mod=1e9+7;
  11.  
  12. //贪心从字典序小的字符中两个两个取,
  13. //凑成一对塞到头尾,
  14. //最后判一下有几个落单的,
  15. //只有一个有塞到中间,有多个输出Impossible
  16.  
  17. int main(){
  18.     char a[maxn];
  19.     char c[maxn];
  20.     int b[53];
  21.     while(scanf("%s",a)!=EOF){
  22.     int len1=strlen(a);
  23.     sort(a,a+len1);
  24.     memset(b,0,sizeof(b));
  25.     for(int i=0;i<len1;i++){
  26.         if(isupper(a[i]))b[a[i]-'A']++;
  27.         else
  28.         b[a[i]-'G']++;
  29.     }
  30.     int zilen;
  31.     int k=0;
  32.     int judge=0;
  33.     /*for(int i=0;i<52;i++){
  34.         printf("%d",b[i]);
  35.     }
  36.     printf("\n");*/
  37.     for(int i=0;i<len1;){
  38.              if(isupper(a[i]))zilen=b[a[i]-'A'];//个数
  39.              else
  40.                 zilen=b[a[i]-'G'];
  41.                 int halfzilan=zilen/2;
  42.                 while(halfzilan!=0){
  43.                     c[k++]=a[i];
  44.                     halfzilan--;
  45.                 }
  46.                 if(zilen%2!=0){
  47.                         judge++;
  48.                     c[len1/2]=a[i];
  49.                 }
  50.                     i+=zilen;
  51.  
  52.     }
  53.     //printf("%d\n",k);
  54.     if(judge==1){
  55.             for(int i=k+1;i<len1;i++){
  56.                 c[i]=c[len1-1-i];
  57.             }
  58.             
  59.             
  60.     for(int i=0;i<len1;i++){
  61.         printf("%c",c[i]);
  62.     }
  63.     printf("\n");
  64.  
  65.     }
  66.     else if(judge==0){
  67.         for(int i=k;i<len1;i++){
  68.                 //printf("%c ",a[len1-1-i]);
  69.                 c[i]=c[len1-1-i];
  70.             }
  71.             
  72.     for(int i=0;i<len1;i++){
  73.         printf("%c",c[i]);
  74.     }
  75.     printf("\n");
  76.     }
  77.    else
  78.     puts("Impossible");
  79.  
  80. }
  81.  
  82. return 0;
  83. }
     
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值