博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces 486C Palindrome Transformation 贪心+抽象问题本质
阅读量:5952 次
发布时间: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

你可能感兴趣的文章
Unix编程艺术阅读笔记
查看>>
nginx配置location总结及rewrite规则写法
查看>>
12月该知道的
查看>>
[3D]第一人称相机类Camera
查看>>
zookeeper启动报错(数据目录权限不对)
查看>>
VM 监控信息布局
查看>>
Python Pandas -- Series
查看>>
Python3 GUI开发(PyQt)安装和配置
查看>>
在UnrealEngine中用Custom节点实现径向模糊
查看>>
Linux 套接字通信笔记(一)
查看>>
汉诺塔——各种编程范式的解决
查看>>
poi读写Excel文件
查看>>
Android闹钟开发与展示Demo
查看>>
静态库介绍与简单演练及同名资源冲突解决(.a格式的静态库)
查看>>
layoutSubviews
查看>>
67. Add Binary
查看>>
每日一个机器学习算法——机器学习实践
查看>>
graphite+grafana 修改指标存放时间后重启失败
查看>>
pip 安装三方库报超时
查看>>
Demo——为指定的文件加入行号
查看>>