http://codeforces.com/problemset/problem/600/C

题意:给你一个小写字母组成的英文串,将它转换为回文串,要求,改变的字母的个数最小,移动字母不算改变字母。

所得的串字典序是最小的。最后输出所得到的串。

思路:要求改变的字母数最小那么用贪心的思想,就把原来的字母尽可能多的填入要求的串中。

首先,先把原串中的字母统计出来,开个数组存对应的字符的个数,然后从‘a’开始循环,如果对应字母的个数大于1;

如果是偶数个的话,就在所求串两端一边加一个,可以正好加完,若是奇数个的话那么按这样的操作,最后就剩下一个,那么把它加入队列。

最后操作队列中的单个的,然后补一个加到串的两端,直到串被补满。

然后再对串的一半排下序就可以了。

  1. 1 #include<stdio.h>
  2. 2 #include<algorithm>
  3. 3 #include<iostream>
  4. 4 #include<string.h>
  5. 5 int cmp(const void*p,const void*q);
  6. 6 char a[100005*2];
  7. 7 char b[100005*2];
  8. 8 char c[100005*2];
  9. 9 char bb[100005*2];
  10. 10 int aa[26];
  11. 11 #include<queue>
  12. 12 using namespace std;
  13. 13 int main(void)
  14. 14 {
  15. 15 int n,i,j,k,p,q,l,z;
  16. 16 while(scanf("%s",a)!=EOF)
  17. 17 {
  18. 18 queue<int>que;
  19. 19 z=0;
  20. 20 memset(aa,0,sizeof(aa));
  21. 21 l=strlen(a);
  22. 22 for(i=0; i<l; i++)//统计对应的字母有多少个
  23. 23 {
  24. 24 aa[a[i]-'a']++;
  25. 25 }
  26. 26 int t=0;
  27. 27 for(i=0; i<26; i++)
  28. 28 {
  29. 29 if(aa[i]!=0)
  30. 30 {
  31. 31 if(aa[i]>=2)//大于2的先加在串的两端
  32. 32 {
  33. 33 while(aa[i]>1)
  34. 34 {
  35. 35 aa[i]-=2;
  36. 36 a[t]=i+'a';
  37. 37 a[l-1-t]=i+'a';
  38. 38 t++;
  39. 39 z+=2;
  40. 40 }
  41. 41 }
  42. 42 if(aa[i]==1) que.push(i);//剩下1的入队
  43. 43
  44. 44 }
  45. 45
  46. 46
  47. 47 }
  48. 48 while(!que.empty())
  49. 49 {
  50. 50 int f=que.front();
  51. 51 que.pop();
  52. 52 if(z>=l)
  53. 53 {
  54. 54 break;
  55. 55 }
  56. 56 while(aa[f]>0)
  57. 57 {
  58. 58 aa[f]-=2;
  59. 59 a[t]=f+'a';
  60. 60 a[l-1-t]=f+'a';
  61. 61 t++;
  62. 62 z+=2;
  63. 63 if(z>l)
  64. 64 {
  65. 65 break;
  66. 66 }
  67. 67 }
  68. 68 if(z>=l)//当满了就跳出
  69. 69 {
  70. 70 break;
  71. 71 }
  72. 72 }
  73. 73 int uu;
  74. 74 if(l%2==0)//找串的一半(分奇数偶数讨论)
  75. 75 {
  76. 76 uu=l/2;
  77. 77 }
  78. 78 else uu=(l-1)/2;
  79. 79 for(i=0; i<uu; i++)
  80. 80 {
  81. 81 b[i]=a[i];
  82. 82 }
  83. 83 qsort(b,uu,sizeof(char),cmp);//对串的一半排序
  84. 84 for(i=0; i<uu; i++)
  85. 85 {
  86. 86 printf("%c",b[i]);
  87. 87 }
  88. 88 if(l%2==1)
  89. 89 {
  90. 90 printf("%c",a[(l)/2]);
  91. 91 }
  92. 92 for(i=uu-1; i>=0; i--)
  93. 93 {
  94. 94 printf("%c",b[i]);
  95. 95 }
  96. 96 printf("\n");
  97. 97
  98. 98 }
  99. 99 return 0;
  100. 100 }
  101. 101 int cmp(const void*p,const void*q)
  102. 102 {
  103. 103 char *w=(char*)p;
  104. 104 char *u=(char*)q;
  105. 105 return (*w-'a')-(*u-'a');
  106. 106 }

codeforce-600C. Make Palindrome(贪心)的更多相关文章

  1. CodeForces - 600C Make Palindrome 贪心

    A string is called palindrome if it reads the same from left to right and from right to left. For ex ...

  2. codeforce 600C - Make Palindrome

    练习string 最小变换次数下,且字典序最小输出回文串. #include <cstdio> #include <cstring> #include <cmath> ...

  3. Educational Codeforces Round 2 C. Make Palindrome 贪心

    C. Make Palindrome Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/600/pr ...

  4. codeforces 600C Make Palindrome

    要保证变化次数最少就是出现次数为奇数的相互转化,而且对应字母只改变一次.保证字典序小就是字典序大的字母变成字典序小的字母. 长度n为偶数时候,次数为奇数的有偶数个,按照上面说的搞就好了. n为奇数时, ...

  5. Educational Codeforces Round 2 C. Make Palindrome —— 贪心 + 回文串

    题目链接:http://codeforces.com/contest/600/problem/C C. Make Palindrome time limit per test 2 seconds me ...

  6. SPOJ:The Next Palindrome(贪心&思维)

    A positive integer is called a palindrome if its representation in the decimal system is the same wh ...

  7. [CF1034B] Longest Palindrome - 贪心

    如果自己是回文串可以做中心 如果一个串和另一个串的转置相等则可以凑一对 优先配对 #include <bits/stdc++.h> using namespace std; int n,m ...

  8. CodeForces - 748D Santa Claus and a Palindrome (贪心+构造)

    题意:给定k个长度为n的字符串,每个字符串有一个魅力值ai,在k个字符串中选取字符串组成回文串,使得组成的回文串魅力值最大. 分析: 1.若某字符串不是回文串a,但有与之对称的串b,将串a和串b所有的 ...

  9. Educational Codeforces Round 2

    600A - Extract Numbers    20171106 字符串处理题,稍微注意点细节就能水过 #include<stdlib.h> #include<stdio.h&g ...

随机推荐

  1. 深入理解动态规划DP

    通过最近对于一些算法题的思考,越来越发现动态规划方法的在时间上高效性,往往该问题可以轻松的找到暴力破解的方法,其时间复杂度却不尽人意.下面来看看几个常见的动态规划思路的经典问题 例一.有一段楼梯有10 ...

  2. 【模板】网络最大流(EK、Dinic、ISAP)(网络流)/洛谷P3376

    题目链接 https://www.luogu.com.cn/problem/P3376 题目大意 输入格式 第一行包含四个正整数 \(n,m,s,t\),分别表示点的个数.有向边的个数.源点序号.汇点 ...

  3. idea安装插件 JClassLib Bytecode viewer

    目录 idea安装插件 JClassLib Bytecode viewer 安装过程 使用 idea安装插件 JClassLib Bytecode viewer IDEA 中安装 jClassLib ...

  4. day02 Rsyuc备份服务器

    day02 Rsyuc备份服务器 一.备份 1.什么是备份 备份就是把重要的数据或者文件复制一份保存到另一个地方,实现不同主机之间的数据同步 一般数据比较重要的情况下,数据如果丢失很容易找不回来了的, ...

  5. day17 阶段测验

    题目 1.找出/proc/meminfo文件中以s开头的行,至少用三种方式忽略大小写 有以下几种方法: [root@localhost ~]# grep -iE "^s" /pro ...

  6. Hadoop org.apache.hadoop.util.DiskChecker$DiskErrorException问题等价解决linux磁盘不足解决问题排查

    org.apache.hadoop.util.DiskChecker$DiskErrorException问题等价解决linux磁盘不足解决问题排查 解决"/dev/mapper/cento ...

  7. 【Reverse】每日必逆0x00

    附件:https://files.buuoj.cn/files/aa4f6c7e8d5171d520b95420ee570e79/a9d22a0e-928d-4bb4-8525-e38c9481469 ...

  8. Android 百度地图用法

    一.展示百度地图,并将一个指定的点(根据经纬度确定)展示在手机屏幕中心 1.下载百度地图移动版API(Android)开发包 要在Android应用中使用百度地图API,就要在工程中引入百度地图API ...

  9. static JAVA

    static 关键字:使用static修饰的变量是类变量,属于该类本身,没有使用static修饰符的成员变量是实例变量,属于该类的实例.由于同一个JVM内只对应一个Class对象,因此同一个JVM内的 ...

  10. 删除数据库时报错 ERROR 1010 (HY000): Error dropping database (can't rmdir './cart', errno: 39)

    这是因为在数据目录下有表相关的数据(不是表),此时应该进入存放表的目录下删除与表相关的数据,一般数据存放目录默认为/var/lib/mysql,cd到目录下 执行命令:cd /var/lib/mysq ...