ZeroJudge O087: 王子的名字

最近王子誕生了,國王想要為他取個完美的名字。但是如果只靠自己想實在是很難想到不錯的名字,於是國王決定請人民投稿名字來當作參考。

由於全國的人民實在太多了,到時候投稿的數量可能會多到難以看完,所以國王想請你寫個程式幫幫他。國王給了你一個 Python 函數 (如下),這個函數能夠幫你計算一個名字在國王的心中能夠得到幾分,請你利用這個函數來將人民投稿的名字排序好。(請按照在國王心中的分數由小到大排序,如果兩個名字同分則先投稿的放在前面)

以下是國王給你的 Python 函數,當你把一個名字 (字串) 丟給它,它會為你計算出一個 0~100 的分數,代表這個名字在國王心中能夠得到幾分。請注意,如果你給這個函數的資料並不是一個字串,那計算出來的分數將會是 -1。

def Evaluate(Name: str):                       
    if(type(Name) != str):                     
        return -1                              
                                               
    Score = 0                                  
    NameLen = len(Name)                        
                                               
    for i in range(NameLen):                   
        CharCode = ord(Name[i])                
        Score += ((CharCode * 1123) % 1002)    
                                               
        while (CharCode > 0):                  
            Score += (CharCode % 10)           
            CharCode = (CharCode // 10)        
                                               
    return (Score % 101)                       

範例測資

範例輸入範例輸出
輸入的第一行是一個正整數 N,代表總共募集了 N 個名字。(N ≦ 600)
接下來 N 行,每一行會有一個由字母所組成的字串,代表一個名字。(名字長度為 15 個字以內)
請依照這些名字在國王心中的分數排序之後,每一行輸出一個名字以及這個名字的分數(用空白隔開),所以輸出結果總共會有 N 行。
5
Megumin
GawrGura
chunchunmaru
BeggarCannon
Kazuma
Megumin 17
BeggarCannon 19
GawrGura 50
Kazuma 56
chunchunmaru 88
ZeroJudge O087 範例測資

解題思路

以下是上述的函式轉成 C++ 的樣子:

int Evaluate(const string str) {
    int Score = 0;
    for (int i = 0; i<str.length(); i++) {
        int CharCode = float(str[i]);
        Score += CharCode * 1123 % 1002;
        while (CharCode > 0) {
            Score += CharCode % 10;
            CharCode /= 10;
        }
    }
    return Score % 101;
}

使用 Pair 來進行收資料的動作,將名字進行輸入之後判斷其分數,並且宣告一個 Pair<int, int> 陣列,將分數作為 Pair.first,第幾個收進來的放在 Pair.second。宣告一個字串陣列並將字串存在這裡。

之後直接 Sort 這個陣列,因為有存進來的順序所以先進來的人會排在前面。利用 Pair.second 來輸出字串。

範例程式碼-ZeroJudge O087: 王子的名字

#include <iostream>
#include <algorithm>
using namespace std;

int Evaluate(const string str) {
    int Score = 0;
    for (int i = 0; i<str.length(); i++) {
        int CharCode = float(str[i]);
        Score += CharCode * 1123 % 1002;
        while (CharCode > 0) {
            Score += CharCode % 10;
            CharCode /= 10;
        }
    }
    return Score % 101;
}

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    int N;
    cin >> N;
    pair<int, int> score[1000] = {};
    string name[1000] = {};
    for (int i = 0; i<N; i++) {
        cin >> name[i];
        score[i].first = Evaluate(name[i]);
        score[i].second = i;
    }
    sort(score, score+N);
    for (int i = 0; i<N; i++) {
        cout << name[score[i].second] << " " << score[i].first << "\n";
    }
}

//ZeroJudge O087
//Dr. SeanXD

發佈留言