问题标题: 酷町堂:1491

0
0
已解决
周明轩
周明轩
资深光能
资深光能

题目描述 Description

酷町堂共有n个学生,现统计每位学生的出生年月日,试找出所有同年同月同日生的学生,并输出出来。

输入描述 Input Description

输入为n+1行:
第一行为酷町堂的学生数n(n≤100);
之后的n行为酷町堂学员的姓名以及出生年(其中年份在01年以后)、月、日,中间用单个空格隔开。

输出描述 Output Description

输出每一行为每一组生日相同的学生,其中前三个数字表示出生年、月、日,之后为生日相同的学生姓名。对于所有的输出,年月日按照从日历从前到后的顺序输出,对于生日相同的学生姓名,按照姓名从短到长的顺序输出,如果长度相同,则按照字典序输出。如果没有生日相同的学生,则输出“No”。

样例输入 Sample Input

6 Liudehua 05 3 2 Zhoujielun 05 4 5 Chenyixue 05 3 2 Huge 05 4 5 Liuyifei 05 3 2 Wanglihong 06 3 2

样例输出 Sample Output

05 3 2 Liudehua Liuyifei Chenyixue 05 4 5 Huge Zhoujielun

25分:

#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
struct m{
	string name;
	string y;
	int m,d;
}f[105];
bool b[105];
bool cmp(string a,string b){
	if(a.size()!=b.size()){
		return a.size()<b.size();
	}
	return a<b;
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
    	cin>>f[i].name>>f[i].y>>f[i].m>>f[i].d;
	}
    int ans=0;
	for(int i=1;i<=n;i++){
		string s[105];
		int cnt=0;
		if(b[i]==0){
			for(int j=1;j<=n;j++){
				if(b[j]==0){
					if(f[i].y==f[j].y){
						if(f[i].m==f[j].m){
							if(f[i].d==f[j].d){
								b[j]=1;
								s[cnt++]=f[j].name;
							}
						}
					}
				}
			}
			b[i]=1;
			if(cnt>1){
				cout<<f[i].y<<' '<<f[i].m<<' '<<f[i].d<<' ';
				sort(s,s+cnt,cmp);
				for(int j=0;j<cnt;j++){
					cout<<s[j]<<' ';
				}
				cout<<endl;
                ans=1;
			}
		}
	}
    if(ans==0){
        cout<<"No";
    }
    return 0;
}

 

周明轩在2020-08-31 21:20:19追加了内容

@王子健 @李瑞曦 @沈峻宇


1
0
鲁屹宸
鲁屹宸
初级守护
初级守护

cmp错了

bool cmp(node x,node y){
    if(x.a!=y.a){
        return x.a<y.a;
    }
    if(x.b!=y.b){
        return x.b<x.b;
    }
    if(x.c!=y.c){
        return x.c<y.c;
    }
    if(x.s.size()!=y.s.size()){
        return x.s.size()<y.s.size();
    }
    return x.s<y.s;
}

0
我要回答