P1781 宇宙总统

题目描述

地球历公元 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值