【openjudge 计算概论[A]】[结构体与链表练习] 1:生日相同 2.0

1:生日相同 2.0
查看 提交 统计 提问
总时间限制: 1000ms 内存限制: 65536kB
描述
在一个有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

题解】 **【水题来袭! 将所有的数据读进来,然后用C++的排序函数sort 自定义排序方法:第一关键字是月份,第二关键字是天,第三关键字是姓名长度,第四关键字是字典序。排好后,输出即可】

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct ch{
    string name;
    int yue,day,len;
}child[200];
int tmp(ch a,ch b)
{
  if (a.yue<b.yue) return 1;
  if (a.yue>b.yue) return 0;
  if (a.day<b.day) return 1;
  if (a.day>b.day) return 0;
  if (a.len<b.len) return 1;
  if (a.len>b.len) return 0;
  if (a.name<b.name) return 1;
  return 0;
}
int n;
int main()
{
    int i;
    bool t=0;
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
     {
        cin>>child[i].name;
        child[i].len=child[i].name.length();
        scanf("%d%d",&child[i].yue,&child[i].day);
     }
    sort(child+1,child+n+1,tmp);
    i=1;
    while(i<=n)
     {
      if (child[i].yue==child[i+1].yue&&child[i].day==child[i+1].day)
       {
         t=1;
         printf("%d %d ",child[i].yue,child[i].day);
         cout<<child[i].name<<' ';
         int a,b;
         a=child[i].yue; b=child[i].day;
         i++;
         while(child[i].yue==a&&child[i].day==b)
          cout<<child[i++].name<<' ';
         printf("\n");
       }
       else ++i;
     }
    if (!t) printf("None\n");
    return 0;
}

[总结:虽然是水题,但是也要注意不要手残啊,考试之前戒手残!]

你可能感兴趣的:(OpenJudge,北大先修课-计算概论)