1. 程式人生 > 其它 >Codeforces486 C. Palindrome Transformation(貪心)

Codeforces486 C. Palindrome Transformation(貪心)

題意:

在這裡插入圖片描述

解法:

s[1,n]
s[i]對應的字元是s[n-i+1],
如果s[i]!=s[n-i+1],那麼其中一個需要變成另外一個,最小代價時唯一的,先計算出來,
如果p在左半邊,那麼一定走到i修改,
如果p在右半邊,那麼一定走到n-i+1修改,
將所有p要走的位置和修改代價記錄為(i,val).

然後有兩種走法:
一種是先走到左邊,然後從左邊往右邊走,
一種是先走到右邊,然後從右邊往左邊走.

兩種走法的代價都算出來,取min就是答案.

code:

#include<bits/stdc++.h>
#define PI pair<int,int>
using namespace
std; const int maxm=2e6+5; char s[maxm]; int n,p; signed main(){ ios::sync_with_stdio(0); cin>>n>>p; cin>>(s+1); vector<PI>temp; for(int i=1;i<=n/2;i++){ if(s[i]!=s[n-i+1]){ int x=abs(s[i]-s[n-i+1]); x=min(x,min(s[i],s[n-i+
1])-'a'+1+('z'-max(s[i],s[n-i+1]))); if(p<=n/2)temp.push_back({i,x}); else temp.push_back({n-i+1,x}); } } int len=temp.size(); int ans1=0; int pp=p; for(int i=0;i<len;i++){ auto x=temp[i]; ans1+=abs(pp-x.first); pp=x.first;
ans1+=x.second; } int ans2=0; pp=p; for(int i=len-1;i>=0;i--){ auto x=temp[i]; ans2+=abs(pp-x.first); pp=x.first; ans2+=x.second; } cout<<min(ans1,ans2)<<endl; return 0; }