测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A46329. 生日相同 2.0在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日。试找出所有生日相同的学生。输入第一行为整数n,表示有n个学生,n ≤ 180。此后每行包含一个字符串和两个整数,分别表示学生的名字(名字第一个字母大写,其余小写,不含空格,且长度小于20)和出生月(1 ≤ m ≤ 12)日(1 ≤ d ≤ 31)。名字、月、日之间用一个空格分隔输出每组生日…

填空题 困难

题目描述

生日相同 2.0

在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日。试找出所有生日相同的学生。

输入

第一行为整数n,表示有n个学生,n ≤ 180。此后每行包含一个字符串和两个整数,分别表示学生的名字(名字第一个字母大写,其余小写,不含空格,且长度小于20)和出生月(1 ≤ m ≤ 12)日(1 ≤ d ≤ 31)。名字、月、日之间用一个空格分隔

输出

每组生日相同的学生,输出一行,其中前两个数字表示月和日,后面跟着所有在当天出生的学生的名字,数字、名字之间都用一个空格分隔。对所有的输出,要求按日期从前到后的顺序输出。 对生日相同的名字,按名字从短到长按序输出,长度相同的按字典序输出。如没有生日相同的学生,输出”None”

样例输入

6

Avril 3 2

Candy 4 5

Tim 3 2

Sufia 4 5

Lagrange 4 5

Bill 3 2

样例输出

3 2 Tim Bill Avril

4 5 Candy Sufia Lagrange

参考答案

#include <stdio.h> #include <string.h> #define _MAX 181 int n; char name[_MAX][21]; int len[_MAX]; int month[_MAX]; int day[_MAX]; //交换 void swap(int i, int j) { int k, length; len[i] ^= len[j]; len[j] ^= len[i]; len[i] ^= len[j]; month[i] ^= month[j]; month[j] ^= month[i]; month[i] ^= month[j]; day[i] ^= day[j]; day[j] ^= day[i]; day[i] ^= day[j]; length = len[i] > len[j] ? len[i] : len[j]; for (k = 0; k < length; k++) { name[i][k] ^= name[j][k]; name[j][k] ^= name[i][k]; name[i][k] ^= name[j][k]; } return ; } //判断字典顺序 int dic(int i, int j) { int k; for (k = 0; k < len[i]; k++) { if (name[i][k] > name[j][k]) { return 1; } else if (name[i][k] < name[j][k]) { return 0; } } return 0; } //排序 void sequence() { int i = 0, j = 0; for (; i < n - 1; i++) { for (j = i + 1; j < n; j++) { if (month[i] > month[j]) { swap(i, j); } else if (month[i] == month[j]) { if (day[i] > day[j]) { swap(i, j); } else if (day[i] == day[j]) { if (len[i] > len[j]) { swap(i, j); } else if (len[i] == len[j]) { if (dic(i, j)) { swap(i, j); } } } } } } return ; } //输出 void print() { int i, j, count, key = 0; for (i = 0; i < n;) { count = 0; for (j = i + 1; j < n; j++) { if (month[i] == month[j] && day[i] == day[j]) { count++; } else { break; } } if (count) { key++; printf("%d %d ", month[i], day[i]); for (; i < j - 1; i++) { printf("%s ", name[i]); } printf("%s\n", name[i++]); } if (!key) { printf("None\n"); } } return ; } int main(int argc, const char * argv[]) { int i = 0; scanf("%d", &n); for (; i < n; i++) { scanf("%s %d %d", name[i], &month[i], &day[i]); len[i] = (int)strlen(name[i]); } sequence(); print(); return 0; }
上一题 下一题