您的位置:首页 > 其它

基础训练 完美的代价

2018-01-23 16:40 225 查看
//蓝桥杯的练习系统是真的卡啊!!!好不容易出来了,卡的一直提交不了

//这道题我认为最重要的是找到最优策略以及这个过程也不影响下一过程的结果(这也是贪心算法的核心)

  基础练习 完美的代价  

时间限制:1.0s   内存限制:512.0MB
      

问题描述

  回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。

  交换的定义是:交换两个相邻的字符

  例如mamad

  第一次交换 ad : mamda

  第二次交换 md : madma

  第三次交换 ma : madam (回文!完美!)

输入格式

  第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)

  第二行是一个字符串,长度为N.只包含小写字母

输出格式

  如果可能,输出最少的交换次数。

  否则输出Impossible

样例输入

5

mamad

样例输出

3

我的程序:

//当前的一步不影响下一步
#include <iostream>
using namespace std;
int main()
{int N;
char S[8000],key,temp;
int t=0,tiao=0;//计算交换的次数
int i,j;
int time;//当前位置
cin>>N;
cin>>S;
time=N-1;
while(time!=N/2)
{ j=i=N-time-1;
//如果相同直接跳
while(S[time]==S[i]&&i!=time&&time!=N/2){i++; time--;}
//找出与第i个相同的字母
j=i;
while(j<time&&S[j]!=S[time]) j++;
//查找发现没有与第i个相同的 跳
if(j==time) {temp=S[time];S[time]=S[time-1];S[time-1]=temp;t++;tiao++;
if(tiao==1) key=temp;
else if(key!=temp) {cout<<"Impossible"; return 0;} }
//再次判断相同直接跳
while(S[time]==S[i]&&i!=time&&time!=N/2){i++; time--;}
//交换开始
if(j<time&&j>0&&S[i]!=S[time]) {temp=S[j];
while(j>i) {S[j]=S[j-1];t++;j--;}
S[j]=temp;}
if(j<time&&j>0&&time!=N/2) time--;
}
//输出
cout<<t;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息