【ybtoj 高效进阶 2.1】E.生日相同【字符串】

在这里插入图片描述
在这里插入图片描述

分析

先按生日日期排序,第二关键字是名字长度

然后直接考虑生日日期不同的。如果一直是同月同日就一直输出名字,遇到不是同月同日的就换行输出日期再跟着输出名字。

上代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct lwx//My struct is a dog
{
    
    
	string name;
	int month,day;
	bool operator<(const lwx& a)const{
    
    
        if(month!=a.month) return month<a.month;
        if(day!=a.day) return day<a.day;  //排序
        if(name.length()!=a.name.length()) return name.length()<a.name.length();  
        return name<a.name;
    }
}a[100001];
int n,k;
int main()
{
    
    
	cin>>n;
	for(int i=1;i<=n;i++)
	{
    
    
		cin>>a[i].name>>a[i].month>>a[i].day;
	}
	sort(a+1,a+n+1); 
	int nxm=a[1].month,nxd=a[1].day;
	for(int i=2;i<=n;i++)
	{
    
    
		if(nxm!=a[i].month||nxd!=a[i].day)
		{
    
    
			nxm=a[i].month;
			nxd=a[i].day; 
		}
		else k++;
	}
	if(k)
	{
    
    
		cout<<a[1].month<<' '<<a[1].day<<' ';
		cout<<a[1].name<<' ';
		nxm=a[1].month;
		nxd=a[1].day;
		for(int i=2;i<=n;i++)
		{
    
    
			if(a[i].month!=nxm||a[i].day!=nxd)
			{
    
    
				cout<<endl;
				cout<<a[i].month<<' '<<a[i].day<<' ';
				cout<<a[i].name<<' ';
				nxm=a[i].month;
				nxd=a[i].day;
			}
			else
			{
    
    
				cout<<a[i].name<<' ';
			}
		}
	}
	else
	{
    
    
		cout<<"None";
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/dglyr/article/details/113356372