[ 10.4 ]CF每日一题系列—— 486C

Description:

  给你一个指针,可以左右移动,指向的小写字母可以,改变,但都是有花费的a - b 和 a - z花费1,指针移动也要花费,一个单位花费1,问你把当前字符串变成回文串的最小化费是多少

Solution:
  真是贪啊,也怪我没咋理解题意~~

  首先对于字母的调整肯定是有一个最优值得,无法改变的,能改变的就是我们是改变左区间的还是右边的呢?

  我们可以记录改变字母的最大区间长度(一半的区间),我们从0遍历到中间,得到左区间的范围,如过p在左区间就用这个范围,否则用右区间的范围,所以不如直接把p对称到左区间

  然后求距离分类就好了,注意别忘了一开始直接是回文串的判断

Code:

  

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define inf (1 << 28)
using namespace std;
const int maxn = 1e5 + 1e2;
char s[maxn];
int main()
{
    int len,p;
    while(~scanf("%d%d",&len,&p))
    {
        scanf("%s",s);
        //左右对称的!!!
        if(p > len / 2)
            p = len - p;
        else
            p--;

        int ret = 0;
        int first = -1;
        int last = -1;
        for(int i = 0; i < len / 2;++i)
        {
            char a = s[i];
            char b = s[len - 1 - i];
            if(a == b)continue;
            if(first == -1)first = i;
            last = max(last,i);
            if(a < b)swap(a,b);
            int cost = min(a - b,b - a + 26);
            ret += cost;
        }
        if(first == -1 && last == -1)
            ret = 0;
        else if(p <= first)
            ret += last - p;
        else if(p >= last)
            ret += min(p - first,len - p + last);
        else
        {
            ret += last - first;
            ret += min(p - first,last - p);
        }
        printf("%d\n",ret);

    }
    return 0;
}

原文地址:https://www.cnblogs.com/DF-yimeng/p/9742909.html

时间: 2024-10-08 22:11:57

[ 10.4 ]CF每日一题系列—— 486C的相关文章

[ 10.03 ]CF每日一题系列—— 534B贪心

Descripe: 贪心,贪在哪里呢-- 给你初始速度,结尾速度,行驶秒数,每秒速度可变化的范围,问你行驶秒数内最远可以行驶多少距离 Solution: 贪心,我是否加速,就是看剩下的时间能不能减到原始给定的结尾速度 #include <iostream> using namespace std; int main() { int v1,v2; int t,d; while(cin>>v1>>v2) { cin>>t>>d; int ret =

[ 10.08 ]CF每日一题系列—— 602B

Description: 一个数组,保证相邻两个元素值得差小于1,问题,最大值和最小值的差 < 1的区间长度最长是多少 Solution: 还是卡了一下,本来以为是模拟就好了,但是卡时间,想来想去最后还是忽略了一个地方,就是它的保证,相邻元素值得差小于1,就保证了这个序列得变化是以1或0为单位相邻变化的,所以不可能出现5 4 6,所以我们考虑一个数字x的时候只要去找出现的位置就好,我们要找的可能区间有x 和 x + 1区间或者x 和 x - 1区间,所以我们看一下上一个x - 1 出现的位置和x

[ 9.22 ]CF每日一题系列—— 484A Bits

Description: 给你一个l,r的区间让你找一个最小的x并且其二进制数要包含最多的1位,输出它的十进制 Solution: 我本来就是贪心,但是贪大了,想1一直往上添加1,但是忘记了0在中间的情况,考虑好了之后,发现这样贪是错误的,因为越往后位数越大,所以你最后的结果只能是1,11,111,1111,11111,而不可能是10,100,1001,10010,所以应该从后往前贪,这也是我们十进制转二进制的人工算法吧算是,十进制转二进制,手算的时候,就是一步一步确定最高位的1在哪里, cod

CF每日一题系列 —— 415A

http://codeforces.com/problemset/page/7?order=BY_SOLVED_DESC 从5000以内选的,emmm还是比较水的哈 时间还是有的,所以万事万物贵在坚持,希望能坚持下去! Describe: 1 - n个灯线性排列(初始为开),小明可以选择开关 op,这回把op - n 的灯全部关闭,如果(是关着的状态没有影响) 给你小明选择op的操作顺序,输出顺序输出每个灯是由哪个op操作关了的 Solution: 跑暴力就好了,我用了一个比较水的优化,记录当前

[ 9.11 ]CF每日一题系列—— 441C暴力模拟

Description: n * m 的地图,建设k个管道管道只能横竖走,且长度大于等于2,问你任意一种建设方法 Solution: 图里没有障碍,所以先把前k - 1个管道每个分2个长度,最后一个管道一连到底 Code: PS:今天时间没来的急,其实函数可以封装一下的,虽然都是暴力,但也得暴力的优美不是?? #include <iostream> #include <cstdio> using namespace std; int main() { int n,m,k; whil

[ 9.12 ]CF每日一题系列—— 960B暴力数组

Description: 给你两个数组,顺序一定,问你第一个数组连续的几个值等于下一个数组连续的几个值,然后寻找这个值得最大值,也就是满足就换 Solution: 用两个变量索引,判断即可 #include <iostream> #include <cstdio> using namespace std; const int maxn = 1e6 + 1e3; int a[maxn],b[maxn]; int main() { int n,m; while(~scanf("

[ 9.26 ]CF每日一题系列—— 771B递推问题

Description: 给定你命名的规律,1-10个字符,开头必须大写,最多有50个名字,然后告诉你有n个人,判断区间长度为k,那么你将得到n - k + 1个答案(YES or NO) 表示1 - k,2 -k+1,n - K + 1-- n这些人里面是否没有重名,YES没有,NO有,让你推出一种名字的组合方式 Solution: 首先先跑出一个名字数组,这个题目要往后看,所以应该是从后往前推n - k + 2 到 n的名字没有要求,所以我们命名各不相同,从n - k + 1开始,如果是YE

10.15PMP试题每日一题

关于项目.项目集.项目组合,说法正确的是:A.项目集和项目管理的重点在于开展"正确"的项目集和项目B.项目集不是大项目,规模特别大的项目称之为"大型项目"C.项目组合管理注重以"正确"的方式开展项目集和项目D.一个项目至少属于一个项目集,但不一定属于一个项目组合 答案将于明天和新题一起揭晓! 10.12试题答案:D 原文地址:http://blog.51cto.com/13554215/2300214

10.23PMP试题每日一题

实施整体变更控制过程的输入是:A.工作绩效报告.变更请求.事业环境因素B.工作绩效信息.项目管理计划.项目文件C.工作绩效报告.组织过程资产.协议D.工作绩效数据.批准的变更请求.事业环境因素 答案将于明天和新题一起揭晓! 10.22试题答案:C 原文地址:http://blog.51cto.com/13554215/2308077