蓝桥杯练习系统—基础练习 完美的代价

第一部分:题目

问题描述

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

输入格式

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

输出格式

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

样例输入

5
mamad

样例输出

3

第二部分:我的思路

1,能否变成回文串:记录每个小写字母的个数,只要奇数的个数不超过1就可以。

2,最少交换次数:贪心:从两端同时开始,不一样的时候需要找到最近的替换:两边的都可以替换,只要交换次数最小也就是最近。

第三部分:代码

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
    int len;
    cin>>len;
    getchar();//接收cin的回车符
    char s[8001];
    int sum[27]={0};//用来记录26个小写字母的个数
    gets(s);
    for(int i=0;i<len;i++)
    {
        sum[s[i]-‘a‘+1]++;
    }
    int t=0;
    //字母个数为奇数的总数超过1就不可能变成回文串。
    for(int i=1;i<27;i++)
    {
        if(sum[i]%2!=0)
        {
            t++;
        }
        if(t>1)
        {
            break;
        }
    }
    if(t>1)
    {
        cout<<"Impossible"<<endl;
    }
    else
    {
        int count=0;
        int i,j;
        //从两端同时开始,不一样时用离左或右最近的替换:一个一个交换过来。
        for(i=0,j=len-1;i<j;i++,j--)
        {
            if(s[i]!=s[j])
            {
                int min=10000;
                int index;
                int flag=0;
                //可以替换左边的
                for(int l=i+1;l<j;l++)
                {
                    if(s[l]==s[j])
                    {
                        if(min>l-i)
                        {
                            min=l-i;
                            index=l;
                            break;
                        }
                    }
                }
                //可以替换右边的
                for(int l=j-1;l>i;l--)
                {
                    if(s[l]==s[i])
                    {
                        if(min>j-l)
                        {
                            min=j-l;
                            index=l;
                            flag=1;
                            break;
                        }
                    }
                }
                count+=min;
                if(flag)
                {
                    int t=s[index];
                    for(int k=index;k<j;k++)
                    {
                        s[k]=s[k+1];
                    }
                    s[j]=t;
                }
                else
                {
                    int t=s[index];
                    for(int k=index;k>i;k--)
                    {
                        s[k]=s[k-1];
                    }
                    s[i]=t;
                }
            }
        }
        cout<<count<<endl;
    }
    return 0;
}
时间: 2024-11-08 17:40:18

蓝桥杯练习系统—基础练习 完美的代价的相关文章

蓝桥杯练习系统——基础练习 十六进制转十进制

0.下载安装Opencv,当前版本为249. 1.下载Python,当前OPencv版本为249,不过其支持的最新版本的Python为2.7,所以可以下载276版本. 2.下载numpy,开始我使用了1.6,没有通过,错误如图.下载了最新的1.8.1版本. 3.将Opencv安装目录下opencv\build\python\2.7\x86中的cv2.pyd复制到python安装目录Lib\site-packages下. 4.找到opencv源文件内的draw.py运行. 蓝桥杯练习系统--基础练

蓝桥杯练习系统— 算法训练 Beaver&#39;s Calculator

问题描述 从万能词典来的聪明的海狸已经使我们惊讶了一次.他开发了一种新的计算器,他将此命名为"Beaver's Calculator 1.0".它非常特别,并且被计划使用在各种各样的科学问题中. 为了测试它,聪明的海狸邀请了n位科学家,编号从1到n.第i位科学家给这个计算器带来了 ki个计算题.第i个科学家带来的问题编号1到n,并且它们必须按照编号一个一个计算,因为对于每个问题的计算都必须依赖前一个问题的计算结果. 每个教授的每个问题都用一个数 ai,?j? 来描述,i(1≤i≤n)是

蓝桥杯练习系统题解

转于:http://www.cnblogs.com/cshhr/p/3550014.html 蓝桥杯官网练习系统题解(非VIP) BEGIN-4(Fibonacci数列) 有递推公式,大家都知道用递推公式求,仅仅要记得在递推的时候同一时候取模求好 这里给一份另类代码,用矩阵高速幂求,事实上还有循环节 /* (1 1) * (Fn-1) = ( Fn )//矩阵相乘,将就着看吧 (1 0) (Fn-2) (Fn-1) (1 1) * (1 1) * (Fn-2) = ( Fn ) (1 0) (1

蓝桥杯练习系统 C++ CH08 01

题目: 问题描述 已知一个有理数类Zrf_Ratio,实现如下的操作符重载形式: friend std::ostream& operator<<(std::ostream&, const zrf_Ratio&);//输出最简分数 friend std::istream& operator>>(std::istream&, zrf_Ratio&); friend bool operator==(const zrf_Ratio&,

蓝桥杯练习系统历届试题 横向打印二叉树

问题描述 二叉树可以用于排序.其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树. 当遇到空子树时,则把该节点放入那个位置. 比如,10 8 5 7 12 4 的输入顺序,应该建成二叉树如下图所示,其中.表示空白. ...|-1210-|...|-8-|.......|...|-7.......|-5-|...........|-4 本题目要求:根据已知的数字,建立排序二叉树,并在标准输出中横向打印该二叉树. 输入格式 输入数据为一行空格分开的

蓝桥杯练习系统算法提高 求最大值

问题描述 给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大.并且要求你选定的数对的ai之和非负,bi之和非负. 输入格式 输入的第一行为n,数对的个数 以下n行每行两个整数 ai bi 输出格式 输出你选定的数对的ai+bi之和 样例输入 5-403 -625-847 901-624 -708-293 413886 709 样例输出 1715 数据规模和约定 1<=n<=100 -1000<=ai,bi<=1000 思路: 讲道理好嘛~~自己

蓝桥杯练习系统--入门训练+基础练习

入门训练 <1>Fibonacci数列 问题描述  Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式  输入包含一个整数n. 输出格式  输出一行,包含一个整数,表示Fn除以10007的余数. 说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取

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

问题描述 回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的.小龙龙认为回文串才是完美的.现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串. 交换的定义是:交换两个相邻的字符 例如mamad 第一次交换 ad : mamda 第二次交换 md : madma 第三次交换 ma : madam (回文!完美!) 输入格式 第一行是一个整数N,表示接下来的字符串的长度(N <= 8000) 第二行是一个字符串,长度为N.只包含小写字母 输出格式 如果可能

蓝桥杯练习系统错题总结—(二)

好了,开始写错题总结咯.因为我没有会员所以,题都是之前群里大佬总结出来的,没法测试数据,我看题写了之后对照大佬给的答案对比的思路,如果练习系统过不了可以告诉我一下,我们一起改进啊~虽然每篇文章都没什么阅读量哈哈哈.开始吧. 第一题:字符串对比 问题描述  给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一:  1:两个字符串长度不等.比如 Beijing 和 Hebei  2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比