题目描述
地球历公元 6036 年,全宇宙准备竞选一个最贤能的人当总统,共有 nn 个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统。
输入格式
第一行为一个整数 nn,代表竞选总统的人数。
接下来有 nn 行,分别为第一个候选人到第 nn 个候选人的票数。
输出格式
共两行,第一行是一个整数 mm,为当上总统的人的号数。
第二行是当上总统的人的选票。
输入输出样例
输入 #1
5
98765
12365
87954
1022356
985678
输出 #2
4
1022356
说明/提示
票数可能会很大,可能会到 100 位数字。
1<=n<=20
题解思路
原本思路:
是将输入的数,通过字符串存储,挨个将各个数字的字符串长度存储到一个数字中,最后将最长的字符串数字输出,如果出现两个相同的,就再进行比较,刚开始觉得思路还行,后面去实现,发现确实非常麻烦。
最新思路:
直接利用sort+cmp排序输入的字符串:
具体实现cmp:
bool cmp(string a, string b) {
if (a.size() == b.size()) {
return a < b;
}
return a.size() < b.size();
}
主函数实现: 我是通过定义两个数组,一个存储之前下标没变的数字,一个用来存储sort变了之后的数字
ps:定义输入的行数n 最好是通过另外的一个局部变量或者全局变量来进行替换,避免搞混
最后输出sort之后 的 对应的数字的之前的下标(我是通过搜索之前的数组的数字,符合的就输出该下标)和a [ n]
int main(){
int n;
int t;
int max_n = 0;
cin >> n;
t = n;
for (int i = 1; i <= t; i++) {
//b[i] = i;
cin >> a[i];
b[i] = a[i];
}
sort(a+1, a + n+1, cmp);
//for (int i = 1; i <= n; i++) cout << a[i] << endl;
for (int j = 1; j <=t;j++){
//printf("%d %d %d %d\n", j, b[j], max_n,a[j]);
//if (a[b[j]] == a[t]) {
// max_n = b[j];
//}
if (b[j] == a[t]) max_n = j;
}
cout << max_n<<endl;
cout<< a[t];
return 0;
}
代码示例如下:
#include<iostream>
#include<math.h>
#include<algorithm>
#include<cstring>
#include<stdlib.h>
#include<map>
#define N 105
using namespace std;
string a[N];
string b[N];
bool cmp(string a, string b) {
if (a.size() == b.size()) {
return a < b;
}
return a.size() < b.size();
}
int main(){
int n;
int t;
int max_n = 0;
cin >> n;
t = n;
for (int i = 1; i <= t; i++) {
//b[i] = i;
cin >> a[i];
b[i] = a[i];
}
sort(a+1, a + n+1, cmp);
//for (int i = 1; i <= n; i++) cout << a[i] << endl;
for (int j = 1; j <=t;j++){
//printf("%d %d %d %d\n", j, b[j], max_n,a[j]);
//if (a[b[j]] == a[t]) {
// max_n = b[j];
//}
if (b[j] == a[t]) max_n = j;
}
cout << max_n<<endl;
cout<< a[t];
return 0;
}