基础训练 完美的代价
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;
}
//这道题我认为最重要的是找到最优策略以及这个过程也不影响下一过程的结果(这也是贪心算法的核心)
基础练习 完美的代价
时间限制: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;
}
相关文章推荐
- 基础训练 完美的代价(贪心算法)
- 蓝桥杯 基础训练 完美的代价-----------------------------C语言——菜鸟级
- 蓝桥杯 基础训练 完美的代价(转)
- (蓝桥杯)基础练习 完美的代价
- 蓝桥杯 基础练习 完美的代价
- 蓝桥杯 BASIC-19 基础练习 完美的代价
- 基础练习 完美的代价
- 蓝桥杯练习系统—基础练习 完美的代价
- 1573:基础练习 完美的代价
- 蓝桥杯:基础训练——/* 问题描述: 基础练习 完美的代价 时间限制:1.0s 内存限制:512.0MB 问题描述 回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为
- 蓝桥杯 基础练习 完美的代价 【贪心 + string】
- 基础练习——完美的代价
- 基础练习 完美的代价
- 蓝桥杯 基础练习 完美的代价
- 1573:基础练习 完美的代价
- 蓝桥杯 基础练习 完美的代价
- 蓝桥网 基础练习 完美的代价
- 基础练习 完美的代价
- 蓝桥杯 BASIC-19 基础练习 完美的代价(有贪心特点)
- 基础练习 BASIC-19 完美的代价