生日相同
题目链接: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;
}