2014年11月12日 星期三

Codeforces Round #277 Div2 pC Palindrome Transformation

題目是這樣的:
對於一個字串,你有以下操做:
(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;
}

沒有留言:

張貼留言