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

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

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

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

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

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

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<vector>
#include<set>
#include<string>
#include<algorithm> using namespace std;
int a[30];
string s;
void swap1(int x,int y)
{
char ch = s[x];
for(int i=x; i<y; i++)
{
s[i] = s[i+1];
}
s[y] = ch;
return ;
}
void swap2(int x,int y)
{
char ch = s[y];
for(int i=y; i>x; i--)
{
s[i] = s[i-1];
}
s[x] = ch;
return ;
}
int cost;
void solve()
{
int i,j;
for(i=0; i<(s.size()/2); i++)
{
//cout << "i = "<<i << endl;
if(s[i]!=s[s.size()-1-i])
{
for(j=1; j<=s.size()-1-1-i-i; j++)
{
if(s[j+i]== s[s.size()-1-i])//推断是否和最后一个相等。若相等就放到对称位置
{
swap2(i,i+j);//准确写出移动函数
//cout << s << endl;
cost += j;//移动距离
break;
}
else if(s[s.size()-1-i-j] == s[i])//推断是否和第一个相等。若相等就和最后一个互换。即它的最后一个位置(这里所说第一个位置是当前推断的位置不是所有序列的第一个)
{
swap1(s.size()-1-i-j,s.size()-1-i);//注意调用的移动函数是否可行
//cout << s << endl;
cost+= j;
break;
}
}
}
}
return ;
}
int main()
{
int T,i;
int ans;
cin >> T;
getchar();
while(T--)
{
ans = 0;
memset(a,0,sizeof(a));
s.clear();
cin >> s;
getchar();
for(i=0; i<s.size(); i++)
{
a[s[i]-'a']++;
}
int flag = 0;
for(i=0; i<26; i++)//预处理能否够构成回文数
{
if(a[i]%2!=0)
{
ans++;
}
}
cost = 0;
if(ans > 1)
cout << "Impossible" << endl;
else
{
solve();
cout << cost << endl;
}
}
return 0;
}

最新文章

  1. The Installation and Compilation of OpenCASCADE
  2. HDU 1700 Points on Cycle(向量旋转)
  3. xcode arc引起的autorelease报错问题
  4. Java 之 I/O 系列 01 ——基础
  5. SpringBoot配置属性之Server
  6. 树形菜单复选框级联选择HTML
  7. Linux下p2p的聊天功能实现
  8. HTML5新特性之Canvas+drag(拖拽图像实现图像反转)
  9. HTTP协议之 简易浏览器(3)--转载
  10. windows下Jdk和Tomcat的安装配置
  11. Xamarin.Android 绑定友盟社会化分享组件
  12. systemtap原理及使用
  13. repr调试python程序
  14. eclipse 中修改项目名称,启动tomct原项目找不到的问题
  15. AX_RecordSortedList
  16. Java gc中的那些事
  17. Nginx配置https的wordpress站点,wp-content目录下资源404解决方案
  18. gphoto2
  19. 阿里巴巴Java开发手册(详尽版)-个人未注意到的知识点(转)
  20. Centos7安装 mysql5.6.29 shell脚本

热门文章

  1. Django--1、MTV及基本应用
  2. mongodb Shell 启动
  3. C# datagrideview插件的使用
  4. 在iframe内页面完全加载完后,关闭父页面生成的div遮罩层
  5. Codeforces_750_C_(二分查找)
  6. Java学习1_一些基础1——16.5.4
  7. Nginx 通过 certbot 为网站自动配置 SSL 证书并续期
  8. mybatis 使用参数
  9. linux 挂载数据盘
  10. BLOCK层基本概念:bio,request,request_queue