这道题目我用了一上午才做出来,还是看的别人的思路,尽管没有看代码做的有点慢。代码能力还是得加强啊。思维

得缜密。不能想当然,要有根据,写上的代码要有精确度。省的以后还得慢慢调试

思路:贪心。每次都查看两端位置上的字母是否相等。若不相等就在里面查找能使他们相等且所需移动位置最少的那

个。然后交换。记录交换的距离,贪心的离最后一个由近及远找与第一个位置相等的。同理贪心从第一个位置找和最

后一个位置相等且离第一个位置近期的。

。感觉这样的方法确实能够,可是并不会证明这样的策略的正确性。。

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<vector>
  7. #include<set>
  8. #include<string>
  9. #include<algorithm>
  10.  
  11. using namespace std;
  12. int a[30];
  13. string s;
  14. void swap1(int x,int y)
  15. {
  16. char ch = s[x];
  17. for(int i=x; i<y; i++)
  18. {
  19. s[i] = s[i+1];
  20. }
  21. s[y] = ch;
  22. return ;
  23. }
  24. void swap2(int x,int y)
  25. {
  26. char ch = s[y];
  27. for(int i=y; i>x; i--)
  28. {
  29. s[i] = s[i-1];
  30. }
  31. s[x] = ch;
  32. return ;
  33. }
  34. int cost;
  35. void solve()
  36. {
  37. int i,j;
  38. for(i=0; i<(s.size()/2); i++)
  39. {
  40. //cout << "i = "<<i << endl;
  41. if(s[i]!=s[s.size()-1-i])
  42. {
  43. for(j=1; j<=s.size()-1-1-i-i; j++)
  44. {
  45. if(s[j+i]== s[s.size()-1-i])//推断是否和最后一个相等。若相等就放到对称位置
  46. {
  47. swap2(i,i+j);//准确写出移动函数
  48. //cout << s << endl;
  49. cost += j;//移动距离
  50. break;
  51. }
  52. else if(s[s.size()-1-i-j] == s[i])//推断是否和第一个相等。若相等就和最后一个互换。即它的最后一个位置(这里所说第一个位置是当前推断的位置不是所有序列的第一个)
  53. {
  54. swap1(s.size()-1-i-j,s.size()-1-i);//注意调用的移动函数是否可行
  55. //cout << s << endl;
  56. cost+= j;
  57. break;
  58. }
  59. }
  60. }
  61. }
  62. return ;
  63. }
  64. int main()
  65. {
  66. int T,i;
  67. int ans;
  68. cin >> T;
  69. getchar();
  70. while(T--)
  71. {
  72. ans = 0;
  73. memset(a,0,sizeof(a));
  74. s.clear();
  75. cin >> s;
  76. getchar();
  77. for(i=0; i<s.size(); i++)
  78. {
  79. a[s[i]-'a']++;
  80. }
  81. int flag = 0;
  82. for(i=0; i<26; i++)//预处理能否够构成回文数
  83. {
  84. if(a[i]%2!=0)
  85. {
  86. ans++;
  87. }
  88. }
  89. cost = 0;
  90. if(ans > 1)
  91. cout << "Impossible" << endl;
  92. else
  93. {
  94. solve();
  95. cout << cost << endl;
  96. }
  97. }
  98. return 0;
  99. }

uva 10716 Evil Straw Warts Live(贪心回文串)的更多相关文章

  1. UVA 10716 Evil Straw Warts Live(贪心)

    Problem D: Evil Straw Warts Live A palindrome is a string of symbols that is equal to itself when re ...

  2. poj 1854 Evil Straw Warts Live 变成回文要几次

    Evil Straw Warts Live Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1799   Accepted: ...

  3. UVa 10716 - Evil Straw Warts Live

    题目大意:给一个字符串,判断是否能通过交换字母构成回文,如果能,计算所需的最小交换次数. 如果字符串中出现奇数次的字母的个数>1,则不能构成回文.然后...就没思路了...看网上说用贪心的思想先 ...

  4. UVA 12378 Ball Blasting Game 【Manacher回文串】

    Ball Blasting Game Morteza is playing a ball blasting game. In this game there is a chain of differe ...

  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. POJ 1854 - Evil Straw Warts Live

    Description A palindrome is a string of symbols that is equal to itself when reversed. Given an inpu ...

  7. Uva 11584,划分成回文串

    题目链接:https://uva.onlinejudge.org/external/115/11584.pdf 题意: 一个字符串,将它划分一下,使得每个串都是回文串,求最少的回文串个数. 分析: d ...

  8. UVA - 11584 划分字符串的回文串子串; 简单dp

    /** 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34398 UVA - 11584 划分字符串的回文串子串: 简单 ...

  9. uva 10453 【回文串区间dp】

    Uva 10453 题意:给定字符串,问最少插入多少个字符使其变成回文串,并任意输出一种结果. 题解:和Uva 10739类似,这里是只能增加.类似定义dp[i][j]表示子串Si...Sj变为回文串 ...

随机推荐

  1. [ CCO 2015 ] Artskjid

    \(\\\) \(Description\) \(N\)个点\(M\)条边的有向图,求从\(0\)号节点出发,\(N-1\)号节点结束,且图中每个点至多经过一次的最长路. \(N\in[2,18]\) ...

  2. (转)全文检索技术学习(三)——Lucene支持中文分词

    http://blog.csdn.net/yerenyuan_pku/article/details/72591778 分析器(Analyzer)的执行过程 如下图是语汇单元的生成过程:  从一个Re ...

  3. 02C语言基本语法

    C语言基本语法 注释 //行注释 /* 块注释*/ 标识符 标识符是用来标识变量.函数.任何其他用户自定义项目的名称:一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母.下划 ...

  4. react 返回上一页

    import * as React from 'react' import { Layout } from 'antd'; import creatHistory from 'history/crea ...

  5. 【Redis】四、Redis设计原理及相关问题

    (六)Redis设计原理及相关问题   通过前面关于Redis五种数据类型.相关高级特性以及一些简单示例的使用,对Redis的使用和主要的用途应该有所掌握,但是还有一些原理性的问题我们在本部分做一个探 ...

  6. 浅谈java浅拷贝和深拷贝

    前言:深拷贝和浅拷贝的区别是什么? 浅拷贝:被复制的对象的所有变量都含有原来对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之, 浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象.深拷 ...

  7. 洛谷——P1775 古代人的难题_NOI导刊2010提高(02)&& P1936 水晶灯火灵(斐波那契数列)

    P1775 古代人的难题_NOI导刊2010提高(02) P1936 水晶灯火灵 斐波那契数列 1.x,y∈[1…k],且x,y,k∈Z 2.(x^2-xy-y^2)^2=1 给你一个整数k,求一组满 ...

  8. linux hexdump-显示文件十六进制格式

    博主推荐:获取更多 linux文件内容查看命令 收藏:linux命令大全 hexdump命令一般用来查看“二进制”文件的十六进制编码,但实际上它能查看任何文件,而不只限于二进制文件. 语法 hexdu ...

  9. request在作用域中管理属性

    request在作用域中管理属性 制作人:全心全意 在作用域中管理属性 setAttribute(String name,Object object) name:表示变量名,为String类型,在转发 ...

  10. E - Cricket Field

    Description   Once upon a time there was a greedy King who ordered his chief Architect to build a fi ...