北郵OJ-90. 字符串轉換-13網研上機C

  本就想暴力膜試一下,沒想到竟然AC了。。。原來是道枚舉搜索的題。不過也對,複雜度就在百萬級別,沒道理超時。

題目描述
我們將僅由若干個同一小寫字母構成的字符串稱之爲簡單串,例如”aaaa”是一個簡單串,而”abcd”則不是簡單串。現在給你一個僅由小寫字母組成的字符串,你需要用最小的花費,將其轉換成一個簡單串。 花費的計算規則如下:將a到z這26個小寫字母從左到右排成一排,則每個字母都有左右兩個鄰居,我們認爲a的左鄰居是z,z的右鄰居是a。一個字母只能轉換成其相鄰的字母,轉換的花費爲1。一個字母可以進行多次轉換,例如將a轉換成d,可以進行如下的步驟: a->b->c->d,花費爲3。字符串的轉換花費爲所有字母轉換花費之和。例如將字符串”abbbz”轉換成簡單串的最小花費爲3,轉換後的結果爲”bbbbb”。

輸入格式
第一行一個整數T(T≤100),表示測試數據的組數。 每組測試數據只有一行,爲僅含小寫字母的字符串,字符串長度不超過1000。

輸出格式
對於每一組數據,輸出一個整數,表示將字符串轉換成簡單串的最小花費。

輸入樣例
2
abbba
abbac
輸出樣例
2
3

#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXSIZE 1010
#define INF 0x7fffffff
using namespace std;
int abs(int x){
    return x>0?x:-x;
}
int main(){
    int t;
    int len;
    int dist,sum,min;
    char str[MAXSIZE];
    scanf("%d",&t);
    while (t--){
        //input && initiate
        scanf("%s",str);
        len=strlen(str);
        min=INF;
        //cal
        for (char i='a';i<='z';i++){//±éÀúÿ¸ö¿ÉÄÜת»»³ÉµÄ×Ö·û 
            //initiate
            sum=0;
            for (int j=0;j<len;j++){//±éÀú´®¼ÆËã´Ë´Îת»»³É±¾ 
                dist=abs(str[j]-i);
                if (dist>13)
                    dist=26-dist;
                sum+=dist;
            }
            if (sum<min)
                min=sum;
        }
        //output
        printf("%d\n",min);
    }
    return true;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章