博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces 486C Palindrome Transformation 贪心+抽象问题本质
阅读量:5890 次
发布时间:2019-06-19

本文共 1568 字,大约阅读时间需要 5 分钟。

  题目:

  题意:给定长度为n的字符串,给定初始光标位置p,支持4种操作,left,right移动光标指向,up,down,改变当前光标指向的字符,输出最少的操作使得字符串为回文。

  分析:只关注字符串n/2长度,up,down操作是固定不变的,也就是不能优化了,剩下就是left,down的操作数,细想下中间不用管,只关注从左到中间第一个要改变的位置和最后一个要改变的位置即可,具体看代码。

 

#include 
#include
#include
#include
using namespace std;const int M = 1e5+5;int n, p;char str[M];int main() { while( ~scanf("%d %d", &n, &p ) ) { getchar(); gets( str+1 ); int sumchg = 0; //up,down的操作总数 int first = 0; //第一个要改变的位置 bool firstjd = true; int last = 0; //最后一个要改变的位置 for( int i=1; i<=n/2; i++ ) { int d = abs( str[i]-str[n+1-i] ); if( d ) { if( firstjd ) { first = i; firstjd = false; } last = i; sumchg += min( d, 26-d ); //选择up或者down的最小操作数 } } if( p > n/2 ) //由于回文左右对称,所以p在中间右边时也可将p当左边对称位置计算 p = n+1-p; int ret = 0; if( sumchg == 0 ) { //不需要改变输出0 printf("%d\n", ret); continue; } if( first >= p ) //如果p在第一个要改变的左边,p只能向右走,即执行right操作 ret += sumchg + last - p; else if( last <= p ) //如果p在最后一个要改变的右边,p只能向左走,即执行left操作 ret += sumchg + p - first; else ret += min( 2*(p-first)+last-p, 2*(last-p)+p-first ) + sumchg; //p在中间,取求向左向右走的最小值 printf("%d\n", ret); } return 0;}

 

 

 

 

 

转载于:https://www.cnblogs.com/TaoTaoCome/p/4700216.html

你可能感兴趣的文章
动画 球
查看>>
C++中的堆,栈,静态内存区,常量区
查看>>
动态SQL实现与注意事项(有返回值与无返回值动态SQL 实现)
查看>>
java struts2 debug
查看>>
简单够用的设计
查看>>
luogu P1387 最大正方形
查看>>
Android图片圆角效果
查看>>
WeChat Official Account Admin Platform API Introduction
查看>>
C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)
查看>>
poj1635
查看>>
C# LINQ详解(一)
查看>>
视频直播点播nginx-rtmp开发手册中文版
查看>>
ruby学习总结04
查看>>
Binary Tree Paths
查看>>
Ueditor自定义ftp上传
查看>>
线程以及多线程
查看>>
PHP队列的实现
查看>>
单点登录加验证码例子
查看>>
[T-SQL]从变量与数据类型说起
查看>>
稀疏自动编码之反向传播算法(BP)
查看>>