最近王子誕生了,國王想要為他取個完美的名字。但是如果只靠自己想實在是很難想到不錯的名字,於是國王決定請人民投稿名字來當作參考。
由於全國的人民實在太多了,到時候投稿的數量可能會多到難以看完,所以國王想請你寫個程式幫幫他。國王給了你一個 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 |
解題思路
以下是上述的函式轉成 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