對於一個字串,你有以下操做:
(1) 移動游標(左移動一個或右移動一個)
(2) 把當前所指的字母+1 (a->b->c->....->z->a)
給一個字串和游標位置,問最少步驟?
一整個greedy。
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<vector> #include<utility> #include<map> #include<set> #include<queue> #include<cmath> using namespace std; typedef long long int int64; char str[100005]; int cnt[1000005]; int _abs(int a){ return max(a, -a);} int main() { int n, p, hf; scanf("%d %d", &n, &p); scanf("%s", str); if(p >= n/2+1){ p = n+1-p; for(int lx = 0;lx < n/2;lx++){ char c = str[lx]; str[lx] = str[n-lx-1]; str[n-lx-1] = c; } } int count = 0; int min_ok = -1; int max_ok = 0; for(int lx = 0;lx < n/2;lx++){ int dis = _abs((int)str[lx]-(int)str[n-lx-1]); cnt[lx] = min(26-dis, dis); if(min_ok == -1 and cnt[lx] > 0) min_ok = lx+1; if(cnt[lx] > 0) max_ok = lx+1; count += cnt[lx]; } if(count == 0) puts("0"); else{ printf("%d\n", count+min(_abs(p-min_ok),_abs(p-max_ok)) + max_ok - min_ok); } return 0; }
沒有留言:
張貼留言