蓝桥杯_基础训练_完美的代价(贪心)

基础练习 完美的代价

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

问题描述

  回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
  交换的定义是:交换两个相邻的字符
  例如mamad
  第一次交换 ad : mamda
  第二次交换 md : madma
  第三次交换 ma : madam (回文!完美!)

输入格式

  第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
  第二行是一个字符串,长度为N.只包含小写字母

输出格式

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

样例输入

5
mamad

样例输出

3

题解:

用贪心,从左往右遍历字符串,对于当前字符,从右往左找相同的。

如果找到则把它移动到相应对称位置,

找不到的话如果n为奇数,不能构成回文,如果不是第一个不能匹配的也不能构成回文。

代码:

#include <iostream>
#include <cstring>
using namespace std;

int n;
int c;
string a;
int main()
{
    while(cin>>n>>a)
    {
        cnt=0;
        c=-1;
        int j=n-1;
        bool ok=true;
        int sum=0;
        for(int i=0;i<=j;i++)       //从左往右
        {
            for(int t=j;t>=i;t--)    //从右往左挨个搜索与a[i]相同的
            {
                if(i==t)            //如果没有找到
                {
                    if(n%2==0||c!=-1)   //如果n为偶数,则不能成为回文,或者不是第一个不能匹配的,也不能成为回文
                    {
                        ok=false;
                        break;
                    }
                                           //到这里的话肯定n是奇数了。
                    c=1;               //标记第一个不能匹配的
                    sum+=n/2-i;     //为什么不是n/2+1-i呢,因为下标从0开始的,中间的下标是n/2+1-1。
                    break;                    //一定要跳出循环,否则有可能会继续执行下面的语句,j--,就错了
                }
                if(a[t]==a[i])      //如果找到与当前字符相同的
                {
                    for(int k=t;k<j;k++)    //把它移动到对称位置。可以理解为把它后面的字符挨个往前移动一位。然后把结尾下标j--。效果相同
                        a[k]=a[k+1];
                    sum+=j-t;       //计算步数
                    j--;            //结尾下标往前移动一位
                    break;
                }
            }
            if(!ok) break;
        }
        if(!ok) cout<<"Impossible"<<endl;
        else cout<<sum<<endl;
    }
    return 0;
}
时间: 2024-10-10 09:32:22

蓝桥杯_基础训练_完美的代价(贪心)的相关文章

蓝桥杯 基础练习 BASIC-19 完美的代价

基础练习 完美的代价 时间限制:1.0s   内存限制:512.0MB 问题描述 回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的.小龙龙认为回文串才是完美的.现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串. 交换的定义是:交换两个相邻的字符 例如mamad 第一次交换 ad : mamda 第二次交换 md : madma 第三次交换 ma : madam (回文!完美!) 输入格式 第一行是一个整数N,表示接下来的字符串的长度(N <= 80

蓝桥杯_基础训练_数的读法

有点恶心的一道题,做了整整半天才完全对. 思路: 把输入的数从右往左每4位进行分割.然后判断单位级数,输出即可. #include <iostream> #include <cstring> #include <algorithm> using namespace std; int main() { string a; string num[]={"ling ","yi ","er ","san &q

蓝桥杯_基础训练_矩阵面积交

基础练习 矩形面积交 时间限制:1.0s   内存限制:512.0MB 问题描述 平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴.对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积. 输入格式 输入仅包含两行,每行描述一个矩形. 在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示. 输出格式 输出仅包含一个实数,为交的面积,保留到小数后两位. 样例输入 1 1 3 32 2 4 4 样例输出 1.00 题解: 由于不知道输

蓝桥杯_基础训练_龟兔赛跑预测

#include <iostream> using namespace std; int main() { int time=0,v1,v2,t,s,l; while(cin>>v1>>v2>>t>>s>>l) { bool gui=false,tu=false; //gui为真则龟到达终点,tu为真表示兔到达终点 int guil=0,tul=0; //guil表示龟当前的路程,tul表示兔当前时间的路程 time=0; //初始化

第四届蓝桥杯javaC组_马虎的算式

/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: 蓝桥杯赛题 * 作    者:   彭俊豪 * 完成日期:   2016   年 04月 01日 * 版 本 号:      001 * 对任务及求解方法的描述部分 * 问题描述: 小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了. 有一次,老师出的题目是:36 x 495 = ? 他却

第四届蓝桥杯javaC组_第39级台阶

/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: 蓝桥杯赛题 * 作    者:   彭俊豪 * 完成日期:   2016   年 04月 01日 * 版 本 号:      001 * 对任务及求解方法的描述部分 * 问题描述: 小明刚刚看完电影<第39级台阶>,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级! 站在台阶前,他突然又想着

第四届蓝桥杯javaC组_有理数类

/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: 蓝桥杯赛题 * 作    者:   彭俊豪 * 完成日期:   2016   年 04月 01日 * 版 本 号:      001 * 对任务及求解方法的描述部分 * 问题描述: 有理数就是可以表示为两个整数的比值的数字.一般情况下,我们用近似的小数表示.但有些时候,不允许出现误差,必须用两个整数

第四届蓝桥杯javaC组_核桃的数量

/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: 蓝桥杯赛题 * 作    者:   彭俊豪 * 完成日期:   2016   年 04月 01日 * 版 本 号:      001 * 对任务及求解方法的描述部分 * 问题描述: 小张是软件项目经理,他带领3个开发组.工期紧,今天都在加班呢.为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑).

第四届蓝桥杯javaC组_打印十字图

/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: 蓝桥杯赛题 * 作    者:   彭俊豪 * 完成日期:   2016   年 04月 01日 * 版 本 号:      001 * 对任务及求解方法的描述部分 * 问题描述: 小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg) 对方同时也需要在电脑dos窗口中