pku acm 2021题解题报告

本文介绍了一种通过输入家族成员信息构建家族树的方法,并按成员年龄进行排序输出。使用了两个结构体,一个用于存储成员及其父辈信息,另一个用于记录年龄与姓名,通过双重循环建立父子关系并更新年龄。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 该题是的题意:

输入一组数据,包括某个人的人名和他父亲的名字,以及他出生时他父亲的年龄,这些人都是Ted的后代,现在要你整理这些数据,按年龄大小输出这个家族的成员,如果某些成员年龄相同,按照字母的顺序输出;

解题思路:

1.首先构造两个结构体,一个是people{ int bornage;char father[100];char child[100]; }

其中father用来存放他父亲的名字,child用来放他自己的名字,创建一个people类型结构体数组a[110];

另一个结构体是name{int age;char pepname[100]};其中age表示一个人的年龄,pepname表示一个人的姓名;

创建一个name类型的结构体数组b[100];

2.输入数据,再输入数据的过程中遇到father=Ted的数据时,就把此人的姓名放入b[++k].pepname中,k的初始值是0,b[k].age=100-a[i].bornage;(输入数据是存放在a中的)

3.用两层循环来生成家族树;

for(j=1;j<=n;j++)

    for(i=1;i<=n;i++)

        {

           如果a[i].father=b[j].pepname;//说明a[i]是b[j]的儿子;

           b[++k].pepname=a[i].child;

           b[k].age=|b[j].age-a[i].bornage|;

        }

4.对这些成员按年龄大小排序,年龄相同的就按名字的大小排序;

5.输出这些家族的成员即可。

代码实现:

#include<iostream>
#include<math.h>
#include<algorithm>
#include<string>
using namespace std;
struct people
{
 char father[100];
 char child[100];
 int bornage;
}a[1100];
struct name
{
 char pepname[100];
 int age;
}b[1100];
bool cmp(const name &n1,const name &n2)
{
 if(n1.age==n2.age)
  return (strcmp(n1.pepname,n2.pepname)<0);
 return n1.age>n2.age;
}
int main()
{
 int k,rel,i,j,n;
 int cases=1;
 scanf("%d",&rel);
 while(rel--)
 {
  scanf("%d",&n);
  k=0;
  strcpy(b[0].pepname,"Ted");
  b[0].age=100;
  for(i=1;i<=n;i++)
  {
   scanf("%s%s%d",a[i].father,a[i].child,&a[i].bornage);
   if(strcmp(a[i].father,"Ted")==0)
   {
    strcpy(b[++k].pepname,a[i].child);
                b[k].age=100-a[i].bornage;
   }
  }
  printf("DATASET %d/n",cases++);
  for(j=1;j<=n;j++)
     for(i=1;i<=n;i++)
     {
      if(strcmp(b[j].pepname,a[i].father)==0)
      {
       strcpy(b[++k].pepname,a[i].child);
                   b[k].age=abs(b[j].age-a[i].bornage);
      }
     }
   sort(b+1,b+k+1,cmp);
   cout<<b[1].pepname<<" "<<b[1].age<<endl;
   for(i=2;i<=k;i++)
    if(strcmp(b[i].pepname,b[i-1].pepname)!=0)
      cout<<b[i].pepname<<" "<<b[i].age<<endl;
 }
 return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值