问题标题: 酷町堂: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

 

第二个同生日的咋地都输出不出来,大概是这样:

半成品↓

#include<bits/stdc++.h>
using namespace std;
struct abab{
    string n,y;
	int m,d;
}a[105],tes;
bool cmp(abab a,abab b){
    if(a.y!=b.y)return a.y<b.y;
    if(a.m!=b.m)return a.m<b.m;
    if(a.d!=b.d)return a.d<b.d;
    if(a.n.size()!=b.n.size())return a.n.size()<b.n.size();
    return a.n<b.n;
}
bool f=1;
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].n>>a[i].y>>a[i].m>>a[i].d;
	}
	sort(a+1,a+n+1,cmp);
    tes.y=a[1].y,tes.m=a[1].m,tes.d=a[1].d;
	for(int i=1;i<=n;i++){
        if(a[i].y==a[i+1].y&&a[i].m==a[i+1].m&&a[i].m==a[i+1].m&&f==1){
            cout<<a[i].y<<" "<<a[i].m<<" "<<a[i].d<<" ";
            tes.y=a[i].y,tes.m=a[i].m,tes.d=a[i].d;
            f=0;
        }
        if(a[i].y==tes.y&&a[i].m==tes.m&&a[i].m==tes.m)cout<<a[i].n<<" ";
        else if(i!=1){
            cout<<endl;
            f=1;
        }
	}
	return 0;
}

 

吴宇轩在2021-04-02 18:10:27追加了内容

经过大佬的改进,终于。。。25分了呢

#include<bits/stdc++.h>
using namespace std;
struct abab{
    string n,y,m,d;
}a[105];
bool cmp(abab a,abab b){
    if(a.y!=b.y)return a.y<b.y;
    if(a.m!=b.m)return a.m<b.m;
    if(a.d!=b.d)return a.d<b.d;
    if(a.n.size()!=b.n.size())return a.n.size()<b.n.size();
    return a.n<b.n;
}
bool check(int x){
    if(a[x].y==a[x+1].y&&a[x].m==a[x+1].m&&a[x].d==a[x+1].d)return 1;
    return 0;
}
bool f=0;
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].n>>a[i].y>>a[i].m>>a[i].d;
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++){
		if(check(i)){
            cout<<a[i].y<<" "<<a[i].m<<" "<<a[i].d<<" "<<a[i].n;
            f=1;
            while(check(i)){
                i++;
                cout<<" "<<a[i].n;
            }
        }
        cout<<endl;
	}
    if(f==0)cout<<"No";
	return 0;
}

 


0
0
吴宇轩
吴宇轩
初级守护
初级守护

在线等啊!!!急啊!!!

0
汪恺恒
汪恺恒
中级启示者
中级启示者

首先,你的日期要用string 定义,否则前面的0会被省略

其次是第二个循环

应该改成

if(check(i)){
            cout<<a[i].y<<" "<<a[i].m<<" "<<a[i].d<<" "<<a[i].name;
            f=1;
            while(check(i)){//如果符合条件,往后找
                i++;
                cout<<" "<<a[i].name;
            }
            cout<<endl;
        }

还有注意如果循环结束,f==0,则输出 No

之后就是check函数的实现了,其实就是判断日期是否相等

bool check(int x){
    if(a[x].y==a[x+1].y&&a[x].m==a[x+1].m&&a[x].d==a[x+1].d){
        return true;
    }
    return false;
}

 

0
汪恺恒
汪恺恒
中级启示者
中级启示者

你输出endl的位置写错了

应该是在if判断中,while循环结束之后

 

0
李子路
李子路
新手守护
新手守护

想要结果都循环出来,我有个方法:

给结构体多加一个成员id,并初始化a[i].id=-1

然后在check(i)那加上&&a[x+1].id==-1,另外需要是两重for循环。

if(check(i))

{

    a[j].id=i;//去重

    cnt=1 //标志用;

    t=j;//循环输出用

}

输出这里

先判断cnt==1的进行输出

然后判断 a[j].id==i;的输出相同年月日的name,测试代码通过。

 

0
我要回答