codeforces 600C. Make Palindrome(贪心)
2015-11-30 19:44
447 查看
题目链接:【C. Make Palindrome】
Educational Codeforces Round 2
输入一串字符串,用最少的步数把它变成回文串,得到的回文串字典序最小
先改变一些字母,然后改变顺序,改变顺序不算步数
回文串的特点是左右对称,当长度是偶数时,串上的字母的个数全都是偶数个,当长度是奇数时,串上字母有且仅有一个是奇数个
所以我们可以先用数组num[]记录字符串每个字母出现的次数
当这个字母出现的次数是偶数次的时候不作处理,当它是奇数次的时候,查找是否存在另一个奇数次的字母,将它们同时变成偶数次,如果不存在,那这个字母肯定出现在最中间的位置,要求字典序最小,所以查找另一个奇数次时应从最后面开始
处理完后输出即可
Educational Codeforces Round 2
输入一串字符串,用最少的步数把它变成回文串,得到的回文串字典序最小
先改变一些字母,然后改变顺序,改变顺序不算步数
回文串的特点是左右对称,当长度是偶数时,串上的字母的个数全都是偶数个,当长度是奇数时,串上字母有且仅有一个是奇数个
所以我们可以先用数组num[]记录字符串每个字母出现的次数
当这个字母出现的次数是偶数次的时候不作处理,当它是奇数次的时候,查找是否存在另一个奇数次的字母,将它们同时变成偶数次,如果不存在,那这个字母肯定出现在最中间的位置,要求字典序最小,所以查找另一个奇数次时应从最后面开始
处理完后输出即可
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <string> using namespace std; const int inf=2e5+5; char s[inf], si[inf]; int num[30]; int main() { memset(num, 0, sizeof(num)); scanf("%s", s); int len = strlen(s); for(int i = 0; i < len; i++) { num[s[i]-'a']++; } int flag=0, f=-1; for(int i = 0; i < 26; i++) { if(num[i]%2==1) { flag = 0; for(int j = 25; j > i; j--) { if(num[j]%2==1) { flag = 1; num[j]--; num[i]++; break; } } if(flag == 0) f = i; } } int li = 0; for(int i = 0; i < 26; i++) { if(num[i]==0) continue; int t = num[i]/2; while(t--) { si[li++] = i+'a'; } } if(f!=-1) si[li++] = f+'a'; for(int i = 25; i >=0; i--) { if(num[i]==0) continue; int t = num[i]/2; while(t--) { si[li++] = i+'a'; } } printf("%s\n", si); return 0; }
相关文章推荐
- 【题解】.HDU.STDContest.计算机学院大学生程序设计竞赛(2015’11)
- jsp学习
- ios数据持久化--CoreData框架的介绍和使用
- JQuery Mobile 的引用代码,以及在手机浏览器上字体太小的解决办法
- bootstrap快速入门笔记(二)-栅格系统,响应式类
- kafka环境搭建
- 读工业4.0时代有感
- ThinkPHP框架三 空操作和跨控制器调用
- catia笔记
- 35.UITabBarController(标签视图控制器)
- ReactiveCocoa入门-part2
- 杭电ACM1006 Tick and Tick
- 2016校招求职经验
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 7.外部接口的设计
- 应试教育的死穴,恰在于堵死了孩子“犯错”的空间
- NGINX部署项目后浏览器选项卡icon图标不显示
- 码表完整版
- 【c#】—架构函数&&析构函数
- 大鱼吃小鱼游戏-wave.js
- Week Report (2015.11.29)