基础训练 完美的代价

//蓝桥杯的练习系统是真的卡啊!!!好不容易出来了,卡的一直提交不了

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

  基础练习 完美的代价  
时间限制: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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hello689

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值