2025年12月14日 星期日

ZeroJudge 解題筆記:o087. 王子的名字

作者:王一哲
日期:2025年12月14日


ZeroJudge 題目連結:o087. 王子的名字

解題想法


先檢查讀取到的名字是否都是字母,如果有任何一個字元不是字母,分數為 -1;如果所有字元都是字母,按照題目給的規則計分。將分數、索引、名字組成 tuple 或是自訂的 struct ,存入陣列之中,最後按照分數、索引值由小到大排序。

Python 程式碼


使用時間約為 25 ms,記憶體約為 3.3 MB,通過測試。
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 = int(input())
names = []
for i in range(n):
    name = input()
    score = Evaluate(name)
    names.append((score, i, name))
names.sort()
for score, _, name in names:
    print(f"{name:s} {score:d}")


C++ 程式碼


使用時間約為 2 ms,記憶體約為 364 kB,通過測試。
#include <iostream>
#include <string>
#include <cctype>
#include <vector>
#include <algorithm>
using namespace std;

bool check(string s) {  // s 是否都是字母
    for(char c : s) {
        if (!isalpha(c)) return false;
    }
    return true;
}

int evaluate(string name) {  // 計分
    if (!check(name)) return -1;
    int score = 0, namelen = (int)name.size();
    for(int i=0; i<namelen; i++) {
        int charcode = name[i];
        score += ((charcode * 1123) % 1002);
        while(charcode > 0) {
            score += (charcode % 10);
            charcode = (charcode / 10);
        }
    }
    return (score % 101);
}

struct Name {
    string name;
    int score, idx;
};

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int n; cin >> n;
    vector<Name> names;
    for(int i=0; i<n; i++) {
        string name; cin >> name;
        int score = evaluate(name);
        Name data;
        data.name = name;
        data.score = score;
        data.idx = i;
        names.push_back(data);
    }
    sort(names.begin(), names.end(), [] (Name a, Name b) {
        if (a.score == b.score) return a.idx < b.idx;
        return a.score < b.score; } );
    for(auto data : names) cout << data.name << " " << data.score << "\n";
    return 0;
}

自訂結構體之中加上建構子,使用時間約為 2 ms,記憶體約為 340 kB,通過測試。
#include <iostream>
#include <string>
#include <cctype>
#include <vector>
#include <algorithm>
using namespace std;

bool check(string s) {  // s 是否都是字母
    for(char c : s) {
        if (!isalpha(c)) return false;
    }
    return true;
}

int evaluate(string name) {  // 計分
    if (!check(name)) return -1;
    int score = 0, namelen = (int)name.size();
    for(int i=0; i<namelen; i++) {
        int charcode = name[i];
        score += ((charcode * 1123) % 1002);
        while(charcode > 0) {
            score += (charcode % 10);
            charcode = (charcode / 10);
        }
    }
    return (score % 101);
}

struct Name {
    string name;
    int score, idx;

    Name(string a, int b, int c) : name(a), score(b), idx(c) {}
    Name() : name(""), score(-1), idx(-1) {}
};

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int n; cin >> n;
    vector<Name> names (n);
    for(int i=0; i<n; i++) {
        string s; cin >> s;
        names[i].name = s;
        names[i].score = evaluate(s);
        names[i].idx = i;
    }
    sort(names.begin(), names.end(), [] (Name a, Name b) {
        if (a.score == b.score) return a.idx < b.idx;
        return a.score < b.score;
    } );
    for(auto data : names) cout << data.name << " " << data.score << "\n";
    return 0;
}


沒有留言:

張貼留言