初级守护
题目描述 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;
}
中级启示者
首先,你的日期要用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;
}
新手守护
想要结果都循环出来,我有个方法:
给结构体多加一个成员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,测试代码通过。