ZCMU-1841-完美的代价
来源:互联网 发布:javascript图片轮播 编辑:程序博客网 时间:2024/04/30 22:58
1841: 完美的代价
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 5 Solved: 3
[Submit][Status][Web Board]
Description
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如mamad 第一次交换 ad : mamda 第二次交换 md : madma 第三次交换 ma : madam (回文!完美!)
Input
第一行是一个整数N,表示接下来的字符串的长度(N < = 8000) 第二行是一个字符串,长度为N.只包含小写字母
Output
如果可能,输出最少的交换次数。 否则输出Impossible
Sample Input
5
mamad
Sample Output
3
【解析】
这道题之前不是很懂,所以百度了一下..最后锁定到贪心算法,从最前面往后面查询,,比对的话从后面往前面进行
比对注意的是如果是奇数的长度只允许一个字符不能匹配,偶数长度则必须全部都匹配。
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int main(){ char s[10010]; int n,sum=0,flag=1,p=-1,i,j,k,m; scanf("%d%s",&n,s); m=n-1; for(i=0;i<=m-1;i++)//此处为什么是m-1,其实大家可以去模拟一下,因为m是会变的 //比如说样例1,mamad,当ma两个已经找到之后,i变成了1,而此时m变成了2所以就结束了 { for(k=m;k>=i;k--)//从最后一个开始 { if(k==i)//没有找到匹配的 { if(n%2==0||p!=-1)//看长度是否是偶数,是的话就跳出循环了,因为有没匹配到的 { flag=0; break; } p=1;//否则标记一下 sum+=n/2-i;//不能匹配的而且是奇数长度的一定要移动中间 break; } if(s[k]==s[i]) { for(j=k;j<=m-1;j++) s[j]=s[j+1];//把后面的字符都往前移动一下 //比如mamad,m经过匹配之后字符就变成了maadd,这样只用匹配第2个a和a进行匹配 sum+=m-k;//移动需要的步骤 m--; break; } } if(flag==0) break; } if(flag==0) { printf("Impossible\n"); } else { printf("%d\n",sum); } return 0;}
0 0
- ZCMU-1841-完美的代价
- 完美的代价解答
- 完美的代价
- 12.完美的代价
- 蓝桥杯 完美的代价
- 完美的代价-题解
- 完美的代价
- 完美的代价
- 完美的代价
- 完美的代价
- 完美的代价
- 完美的代价
- 完美的代价
- 完美的代价
- 完美的代价
- 完美的代价
- 完美的代价
- 完美的代价
- Android开发实践:拷贝assets到sdcard
- BZOJ 1044: [HAOI2008]木棍分割 DP,前缀和优化,二分答案
- 读《黑客与画家》感想(2)
- linux编译busybox,uboot,kernel等常用到的命令及出现过的问题
- 韩信点兵
- ZCMU-1841-完美的代价
- [SDOI2012] 最近最远点对
- 使用Retrofit和Rxjava下载启动图图片
- Tomcat正常启动,页面报HTTP Status 500 - Class com.fjc.Hello is not a Servlet,控制台报 cannot be cast to javax.se
- 观察者模式高级应用--自定义Swing事件监听器
- java线程快速启动
- [Android]线程间通信方式
- 在linux下用tomcat部署java web项目的过程与注意事项
- [vijos1007] 绕钉子的长绳子