codeforce-600C. Make Palindrome(贪心)
http://codeforces.com/problemset/problem/600/C;
题意:给你一个小写字母组成的英文串,将它转换为回文串,要求,改变的字母的个数最小,移动字母不算改变字母。
所得的串字典序是最小的。最后输出所得到的串。
思路:要求改变的字母数最小那么用贪心的思想,就把原来的字母尽可能多的填入要求的串中。
首先,先把原串中的字母统计出来,开个数组存对应的字符的个数,然后从‘a’开始循环,如果对应字母的个数大于1;
如果是偶数个的话,就在所求串两端一边加一个,可以正好加完,若是奇数个的话那么按这样的操作,最后就剩下一个,那么把它加入队列。
最后操作队列中的单个的,然后补一个加到串的两端,直到串被补满。
然后再对串的一半排下序就可以了。
- 1 #include<stdio.h>
- 2 #include<algorithm>
- 3 #include<iostream>
- 4 #include<string.h>
- 5 int cmp(const void*p,const void*q);
- 6 char a[100005*2];
- 7 char b[100005*2];
- 8 char c[100005*2];
- 9 char bb[100005*2];
- 10 int aa[26];
- 11 #include<queue>
- 12 using namespace std;
- 13 int main(void)
- 14 {
- 15 int n,i,j,k,p,q,l,z;
- 16 while(scanf("%s",a)!=EOF)
- 17 {
- 18 queue<int>que;
- 19 z=0;
- 20 memset(aa,0,sizeof(aa));
- 21 l=strlen(a);
- 22 for(i=0; i<l; i++)//统计对应的字母有多少个
- 23 {
- 24 aa[a[i]-'a']++;
- 25 }
- 26 int t=0;
- 27 for(i=0; i<26; i++)
- 28 {
- 29 if(aa[i]!=0)
- 30 {
- 31 if(aa[i]>=2)//大于2的先加在串的两端
- 32 {
- 33 while(aa[i]>1)
- 34 {
- 35 aa[i]-=2;
- 36 a[t]=i+'a';
- 37 a[l-1-t]=i+'a';
- 38 t++;
- 39 z+=2;
- 40 }
- 41 }
- 42 if(aa[i]==1) que.push(i);//剩下1的入队
- 43
- 44 }
- 45
- 46
- 47 }
- 48 while(!que.empty())
- 49 {
- 50 int f=que.front();
- 51 que.pop();
- 52 if(z>=l)
- 53 {
- 54 break;
- 55 }
- 56 while(aa[f]>0)
- 57 {
- 58 aa[f]-=2;
- 59 a[t]=f+'a';
- 60 a[l-1-t]=f+'a';
- 61 t++;
- 62 z+=2;
- 63 if(z>l)
- 64 {
- 65 break;
- 66 }
- 67 }
- 68 if(z>=l)//当满了就跳出
- 69 {
- 70 break;
- 71 }
- 72 }
- 73 int uu;
- 74 if(l%2==0)//找串的一半(分奇数偶数讨论)
- 75 {
- 76 uu=l/2;
- 77 }
- 78 else uu=(l-1)/2;
- 79 for(i=0; i<uu; i++)
- 80 {
- 81 b[i]=a[i];
- 82 }
- 83 qsort(b,uu,sizeof(char),cmp);//对串的一半排序
- 84 for(i=0; i<uu; i++)
- 85 {
- 86 printf("%c",b[i]);
- 87 }
- 88 if(l%2==1)
- 89 {
- 90 printf("%c",a[(l)/2]);
- 91 }
- 92 for(i=uu-1; i>=0; i--)
- 93 {
- 94 printf("%c",b[i]);
- 95 }
- 96 printf("\n");
- 97
- 98 }
- 99 return 0;
- 100 }
- 101 int cmp(const void*p,const void*q)
- 102 {
- 103 char *w=(char*)p;
- 104 char *u=(char*)q;
- 105 return (*w-'a')-(*u-'a');
- 106 }
codeforce-600C. Make Palindrome(贪心)的更多相关文章
- 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 ...
- codeforce 600C - Make Palindrome
练习string 最小变换次数下,且字典序最小输出回文串. #include <cstdio> #include <cstring> #include <cmath> ...
- Educational Codeforces Round 2 C. Make Palindrome 贪心
C. Make Palindrome Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/600/pr ...
- codeforces 600C Make Palindrome
要保证变化次数最少就是出现次数为奇数的相互转化,而且对应字母只改变一次.保证字典序小就是字典序大的字母变成字典序小的字母. 长度n为偶数时候,次数为奇数的有偶数个,按照上面说的搞就好了. n为奇数时, ...
- Educational Codeforces Round 2 C. Make Palindrome —— 贪心 + 回文串
题目链接:http://codeforces.com/contest/600/problem/C C. Make Palindrome time limit per test 2 seconds me ...
- SPOJ:The Next Palindrome(贪心&思维)
A positive integer is called a palindrome if its representation in the decimal system is the same wh ...
- [CF1034B] Longest Palindrome - 贪心
如果自己是回文串可以做中心 如果一个串和另一个串的转置相等则可以凑一对 优先配对 #include <bits/stdc++.h> using namespace std; int n,m ...
- CodeForces - 748D Santa Claus and a Palindrome (贪心+构造)
题意:给定k个长度为n的字符串,每个字符串有一个魅力值ai,在k个字符串中选取字符串组成回文串,使得组成的回文串魅力值最大. 分析: 1.若某字符串不是回文串a,但有与之对称的串b,将串a和串b所有的 ...
- Educational Codeforces Round 2
600A - Extract Numbers 20171106 字符串处理题,稍微注意点细节就能水过 #include<stdlib.h> #include<stdio.h&g ...
随机推荐
- 深入理解动态规划DP
通过最近对于一些算法题的思考,越来越发现动态规划方法的在时间上高效性,往往该问题可以轻松的找到暴力破解的方法,其时间复杂度却不尽人意.下面来看看几个常见的动态规划思路的经典问题 例一.有一段楼梯有10 ...
- 【模板】网络最大流(EK、Dinic、ISAP)(网络流)/洛谷P3376
题目链接 https://www.luogu.com.cn/problem/P3376 题目大意 输入格式 第一行包含四个正整数 \(n,m,s,t\),分别表示点的个数.有向边的个数.源点序号.汇点 ...
- idea安装插件 JClassLib Bytecode viewer
目录 idea安装插件 JClassLib Bytecode viewer 安装过程 使用 idea安装插件 JClassLib Bytecode viewer IDEA 中安装 jClassLib ...
- day02 Rsyuc备份服务器
day02 Rsyuc备份服务器 一.备份 1.什么是备份 备份就是把重要的数据或者文件复制一份保存到另一个地方,实现不同主机之间的数据同步 一般数据比较重要的情况下,数据如果丢失很容易找不回来了的, ...
- day17 阶段测验
题目 1.找出/proc/meminfo文件中以s开头的行,至少用三种方式忽略大小写 有以下几种方法: [root@localhost ~]# grep -iE "^s" /pro ...
- Hadoop org.apache.hadoop.util.DiskChecker$DiskErrorException问题等价解决linux磁盘不足解决问题排查
org.apache.hadoop.util.DiskChecker$DiskErrorException问题等价解决linux磁盘不足解决问题排查 解决"/dev/mapper/cento ...
- 【Reverse】每日必逆0x00
附件:https://files.buuoj.cn/files/aa4f6c7e8d5171d520b95420ee570e79/a9d22a0e-928d-4bb4-8525-e38c9481469 ...
- Android 百度地图用法
一.展示百度地图,并将一个指定的点(根据经纬度确定)展示在手机屏幕中心 1.下载百度地图移动版API(Android)开发包 要在Android应用中使用百度地图API,就要在工程中引入百度地图API ...
- static JAVA
static 关键字:使用static修饰的变量是类变量,属于该类本身,没有使用static修饰符的成员变量是实例变量,属于该类的实例.由于同一个JVM内只对应一个Class对象,因此同一个JVM内的 ...
- 删除数据库时报错 ERROR 1010 (HY000): Error dropping database (can't rmdir './cart', errno: 39)
这是因为在数据目录下有表相关的数据(不是表),此时应该进入存放表的目录下删除与表相关的数据,一般数据存放目录默认为/var/lib/mysql,cd到目录下 执行命令:cd /var/lib/mysq ...