C语言练习题--洛谷P生日*****(学会了新的思路)
题目描述
cjf 君想调查学校 OI 组每个同学的生日,并按照年龄从大到小的顺序排序。但 cjf 君最近作业很多,没有时间,所以请你帮她排序。
输入格式
输入共有 n+1 行,
第 1 行为 OI 组总人数 n;
第 2 行至第 n+1 行分别是每人的姓名 s、出生年 y、月 m、日 d。
输出格式
输出共有 n 行,
即 n 个生日从大到小同学的姓名。(如果有两个同学生日相同,输入靠后的同学先输出)
输入输出样例
输入 #1复制
3 Yangchu 1992 4 23 Qiujingya 1993 10 13 Luowen 1991 8 1
输出 #1复制
Luowen Yangchu Qiujingya
说明/提示
数据保证,1<n<100,1≤∣s∣<20。保证年月日实际存在,且年份 ∈[1960,2020]。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct stu
{
int num;
int date;
char name[25];
};
int compar(const void *p1,const void *p2)
{
return ((struct stu*)p1)->date-((struct stu*)p2)->date;
}
int main()
{
int n,i,y,m,d;
struct stu str[115];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s%d%d%d",str[i].name,&y,&m,&d);
str[i].num=i;
str[i].date=y*10000+m*100+d;//把每个人的年月日组成一个数字,数字越小,代表年龄越大,或许前面的排序题也可以用这种组合的思路,可以省去很多if哈哈哈
}
qsort(str,n,sizeof(str[0]),compar);
for(i=1;i<n;i++)
{
if(str[i].date==str[i-1].date)
{
if(str[i].num>str[i-1].num)
{
char ans[25]={'\0'};
strcpy(ans,str[i].name);
strcpy(str[i].name,str[i-1].name);
strcpy(str[i-1].name,ans);
}
}
}
for(i=0;i<n;i++)
printf("%s\n",str[i].name);
return 0;
}