uva10716 - - Evil Straw Warts Live
2016-03-05 13:32
351 查看
题意:
给你一个串,问你是否能改动它们的顺序使之成为回文,能改变的话,最小改动数呢
思路:
看到题目的第一思路是能不能通过记录相同字符的位置来做,想来想去还是枪毙了,参考了他人做法,思路清晰明了(T——T,感觉我老是把简单问题想得复杂化了,终究是没想到点上。)
贪心法,主要就是从两端开始确定,慢慢向中间缩进,若两端相同,则直接缩进,若不同,则双向搜索能替换左右使其相等的最近交换距离,直到成功找到
代码如下:
给你一个串,问你是否能改动它们的顺序使之成为回文,能改变的话,最小改动数呢
思路:
看到题目的第一思路是能不能通过记录相同字符的位置来做,想来想去还是枪毙了,参考了他人做法,思路清晰明了(T——T,感觉我老是把简单问题想得复杂化了,终究是没想到点上。)
贪心法,主要就是从两端开始确定,慢慢向中间缩进,若两端相同,则直接缩进,若不同,则双向搜索能替换左右使其相等的最近交换距离,直到成功找到
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 105; char str , ans[30]; int main(){ int cas; scanf("%d\n", &cas); while (cas--) { memset(ans, 0, sizeof(ans)); scanf("%s",str); int n = strlen(str); for (int i = 0; i < n; i++) ans[str[i] - 'a']++; int t = 0; for (int i = 0; i < 30; i++) if (ans[i] % 2 != 0) t++; if (t > 1){ printf("Impossible\n"); continue; } int cnt = 0, start, end; for (start = 0, end = n - 1; start < end; start++, end--){ if (str[start] != str[end]) { int l = start; while (str[l] != str[end]) l++; int r = end; while (str[r] != str[start]) r--; char ch; if (l - start > end - r){ ch = str[r]; for (int j = r; j < end; j++){ str[j] = str[j + 1]; } str[end] = ch; cnt += end - r; } else { ch = str[l]; for (int j = l; j > start; j--){ str[j] = str[j - 1]; } str[start] = ch; cnt += l - start; } } } printf("%d\n", cnt); } return 0; }
相关文章推荐
- Android获取代码Color资源
- 素数算法总结
- linux 数组的简单总结
- hdoj Ignatius and the Princess II (全排列)
- HBase—扫描器
- 地址的层次性
- CocoaPods安装及使用
- Understanding the JVM Reading Notes 1
- Codeforces Round #341 (Div. 2)C. Wet Shark and Flowers(数学期望)
- linux ---jenkins的安装与配置
- 作死之旅: 数据动态可视化
- hdu-5437 Alisha’s Party (优先队列)
- 一起看代码来玩玩QT之18 QSqlDatabase (three 将database 通过 QTableView显示到界面上,并且增删改查
- Android开发问题记录(一)——启动Eclipse报错:发现了以元素 'd:skin' 开头的无效内容
- opencv学习三
- Java web学习(二)
- ViewPager实现无限循环,左右滑动,定时轮播及内存泄漏处理
- 2..移动APP开发使用什么样的原型设计工具比较合适?
- 光线与包围盒(AABB)的相交检测算法
- PHP中不同编码的汉字占的字节数不同gbk,GBK,UTF-8,utf-8