P1781 宇宙总统
1.题目介绍
题目描述
地球历公元 6036 年,全宇宙准备竞选一个最贤能的人当总统,共有 \(n\) 个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统。
输入格式
第一行为一个整数 \(n\),代表竞选总统的人数。
接下来有 \(n\) 行,分别为第一个候选人到第 \(n\) 个候选人的票数。
输出格式
共两行,第一行是一个整数 \(m\),为当上总统的人的号数。
第二行是当上总统的人的选票。
样例 #1
样例输入 #1
5
98765
12365
87954
1022356
985678
样例输出 #1
4
1022356
提示
票数可能会很大,可能会到 \(100\) 位数字。
\(1 \leq n \leq 20\)。
2.题解
2.1 字典序算法
思路
这里由于票数可能会很大,可能会到 100 位数字,甚至用long long都无法存储,所以这里考虑使用字符串存储
那么字符串之间该如何比较大小呢?这就涉及到了字典序算法:
字典序,就是按照字典中出现的先后顺序进行排序。
1、单个字符
在计算机中,25个字母以及数字字符,字典排序如下:
'0' < '1' < '2' < ... < '9' < 'a' < 'b' < ... < 'z'
比如在 python 中, '0' < '9' < 'a' < 'z' 这个表达式就会返回 True。
2、多个字符
这是单个字符的大小情况,那么如果是两个字符串比较大小呢?在计算机中,两个字符串比较大小,是按照从左到右的顺序进行比较,如果第1位相等,就比较第2位,直至有一位可以比较出大小来,则不再继续比较。
使用计算机属于来描述:
对于任意两个序列 (a,b) 和 (a’,b’),字典序定义为: (a,b) ≤ (a′,b′) 当且仅当 a < a′ 或 (a = a′ 且 b ≤ b′).
代码
#include<bits/stdc++.h>
using namespace std;
struct Candidate{
string votes = "";
int id;
};
bool cmp(Candidate c1, Candidate c2){
if(c1.votes.length() != c2.votes.length()) return c1.votes.length() > c2.votes.length();
return c1.votes > c2.votes;
}
int main(){
int n;
cin >> n;
Candidate ans;
for (int i = 0; i < n; i++){
Candidate per;
cin >> per.votes;
if(cmp(per, ans)) {
ans.votes = per.votes;
ans.id = i + 1;
}
}
cout << ans.id << endl << ans.votes;
}