【ybt高效进阶2-1-5】生日相同

生日相同

题目链接:ybt高效进阶2-1-5

题目大意

有一堆人,给出他们的生日,要你找出所有生日相同的人。
日期按从前往后顺序,人名先从短到长,然后再按字典序排序。

思路

这道题其实就是简单模拟一下。

我用的是开 vector,每个记录某个日子有哪些编号的人生日。

然后从前往后枚举日子,里面有超过一个人的就按照题目要求排序,然后输出。

题解写的是用 string,而且是先直接按日子和人名排序要求把整个所有人的信息都排序。
然后直接扫过去,对于每个连续的日子相同的长度超过一的端就直接输出。

代码

#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;

int n, x, y, size[100001], tmp[100001];
char name[100001][256];
vector <int> same[13][32];//记录同一天生日的有哪些人
bool write;

bool cmp(int x, int y) {
    
    
	if (size[x] != size[y]) return size[x] < size[y];//先按长短排
	for (int i = 0; i < size[x]; i++)//长短一样,按字典序排
		if (name[x][i] != name[y][i])
			return name[x][i] < name[y][i];
}

int main() {
    
    
	scanf("%d", &n);
	
	for (int i = 1; i <= n; i++) {
    
    
		cin >> name[i];
		size[i] = strlen(name[i]);
		scanf("%d %d", &x, &y);
		same[x][y].push_back(i);
	}
	
	for (int i = 1; i <= 12; i++)
		for (int j = 1; j <= 31; j++) {
    
    
			x = same[i][j].size();
			if (x <= 1) continue;//只有一个人或者没有人
			
			write = 1;//有人在同一天生日,记录一下
			
			for (int k = 0; k < x; k++)
				tmp[k] = same[i][j][k];
			sort(tmp, tmp + x, cmp);//排序
			
			printf("%d %d ", i, j);
			for (int k = 0; k < x; k++)
				printf("%s ", name[tmp[k]]);
			cout << endl;//不知道为什么,用 printf("\n") 和 puts("") 都没有用,要用 cout << endl
		}
	
	if (!write) printf("None");//没有人在同一天生日
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43346722/article/details/112853233