日期: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;
}
沒有留言:
張貼留言