1. 程式人生 > >3.1資料結構之結構 6377 生日相同 2.0

3.1資料結構之結構 6377 生日相同 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
//http://noi.openjudge.cn/
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct Person{
		string name;
		int mon,day;
	}Stu[181];
int compare(const Person &a,const Person &b)
{
	if(a.mon!=b.mon)return a.mon<b.mon;
	if(a.day!=b.day)return a.day<b.day;
	if(a.name.size()==b.name.size())return a.name<b.name;
	return a.name.size()<b.name.size();
}
int main()
{
	//freopen("st.in","r",stdin),
	//freopen("st.out","w",stdout);
	
	int n,book[13][33]={0},b=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>Stu[i].name>>Stu[i].mon>>Stu[i].day;
	sort(Stu+1,Stu+1+n,compare);
	for(int i=1;i<=n;i++)
	if(Stu[i].mon==Stu[i+1].mon&&Stu[i].day==Stu[i+1].day&&book[Stu[i].mon][Stu[i].day]==0)
		{
			if(b)cout<<endl;
			b=1;
			cout<<Stu[i].mon<<" "<<Stu[i].day<<" "<<Stu[i].name;
			book[Stu[i].mon][Stu[i].day]=1;
		}
		else
			if(book[Stu[i].mon][Stu[i].day]==1)
					cout<<" "<<Stu[i].name;
	if(!b)cout<<"None";
	return 0;
}