Codeforces486 C. Palindrome Transformation(貪心)
阿新 • • 發佈:2021-02-18
題意:
解法:
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;
}