zoukankan      html  css  js  c++  java
  • CF486C Palindrome Transformation(贪心)

    传送门

    思路

    首先,将对应的位置变成相同的字母的代价是固定的,可以预处理出来。
    接着,根据p所在的位置分类讨论,如果p在左半边,一定是将左半边变成跟右半边一样的代价是最小的,因为这样省去了移动指针的代价。
    处理两个指针l,r,表示该部分中需要处理的左端点跟右端点,根据p的位置分类讨论就可以了。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<ll, ll>PLL;
    typedef pair<int, int>PII;
    typedef pair<double, double>PDD;
    #define I_int ll
    inline ll read()
    {
        ll x = 0, f = 1;
        char ch = getchar();
        while(ch < '0' || ch > '9')
        {
            if(ch == '-')f = -1;
            ch = getchar();
        }
        while(ch >= '0' && ch <= '9')
        {
            x = x * 10 + ch - '0';
            ch = getchar();
        }
        return x * f;
    }
    #define read read()
    #define closeSync ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
    #define multiCase int T;cin>>T;for(int t=1;t<=T;t++)
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i<(b);i++)
    #define per(i,a,b) for(int i=(a);i>=(b);i--)
    #define perr(i,a,b) for(int i=(a);i>(b);i--)
    ll ksm(ll a, ll b, ll p)
    {
        ll res = 1;
        while(b)
        {
            if(b & 1)res = res * a % p;
            a = a * a % p;
            b >>= 1;
        }
        return res;
    }
    const int inf = 0x3f3f3f3f;
    #define PI acos(-1)
    
    const int maxn=1e5+10;
    int n,k;
    string s;
    int dp[maxn];
    
    int cul(char ch1,char ch2){
    	int x=ch1-96,y=ch2-96;
    	return min(abs(x-y),min(abs(x+26-y),abs(x-y-26)));
    }
    
    int main()
    {
    	cin>>n>>k>>s;
    	k--;
    	for(int i=0;i<n;i++)
    		dp[i]=cul(s[i],s[n-i-1]);//将两个位置的字母统一需要多少步
    	int l=-1,r=-1,res=0;
    	if(k<n/2){
    		for(int i=0;i<=n/2;i++)
    			if(dp[i]){
    				l=i;break;
    			}
    		for(int i=n/2-1;i>=0;i--)
    			if(dp[i]){
    				r=i;break;
    			}
    		if(l==r&&l==-1){
    			puts("0");
    			return 0;
    		}
    		if(k<=l) res+=r-k;
    		else if(k>=r) res+=k-l;
    		else res+=r-l+min(k-l,r-k);//先到l还是先到k
    		for(int i=l;i<=r;i++)
    			res+=dp[i];
    		
    	}  	
    	else{
    		for(int i=n/2;i<=n;i++)
    			if(dp[i]){
    				l=i;break;
    			}
    		for(int i=n;i>=n/2;i--)
    			if(dp[i]){
    				r=i;break;
    			}
    		if(l==r&&l==-1){
    			puts("0");
    			return 0;
    		}
    		if(k<=l) res+=r-k;
    		else if(k>=r) res+=k-l;
    		else res+=r-l+min(k-l,r-k);//先到l还是先到k
    		for(int i=l;i<=r;i++)
    			res+=dp[i];
    	}
    	
    	cout<<res<<endl;
        return 0;
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  • 相关阅读:
    Mybatis plus 配置
    logback配置
    iview-ui-project-4.0 安装与配置
    Linux系统下Redis安装与配置
    Java中枚举的用法
    Mysql 查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
    java 基础知识一 初识java
    docker 查看 挂载目录
    sqlserver统计所有表及表中记录数
    centos7配置禁用ipv6
  • 原文地址:https://www.cnblogs.com/OvOq/p/14821502.html
Copyright © 2011-2022 走看看