今天是特德100岁生日。几周前,你被泰德家族选为联络泰德所有后代并组织一个惊喜派对的人。为了使这项任务更简单,您创建了一个以年龄为优先顺序的列表,列出了从Ted派生的所有人。同龄后代按字典顺序列出。
你唯一需要帮助的材料就是出生证明。奇怪的是,这些出生证明没有注明日期。他们简单地列出了父亲的名字,孩子的名字,以及孩子出生时父亲的确切年龄。
输入
这个问题的输入将以包含一个整数n的行开始,该整数n指示数据集的数目。每个数据集将根据以下描述进行格式化。 单个数据集有两个组件:
后代计数-包含单个整数x(其中0<x<100)的行,指示Ted后代的数量。
出生证明列表-X个出生证明的数据,每行一个证明的数据。每个证书的数据将采用“fname cname fage”格式,其中: fname是父亲的名字。
cname是孩子的名字。
Fage是CNames出生之日父亲的整数年龄。
注:名称是个人的唯一标识符,不包含嵌入的空白。
泰德的所有后代都共享泰德的生日。因此,任何两个年龄差都是整数年。(对于那些非常挑剔的人来说,假设他们都是在同一个时间、分钟、秒等等出生的……他们出生的年份。)
你有泰德所有后代的出生证明(完整的收集)。
输出
对于每个数据集,将有x+1行输出。第一个将读取“数据集Y”,其中Y是第一个数据集的1,2是第二个数据集的2,等等。随后的X行使用“名称年龄”格式构成了特德后代的年龄优先列表及其年龄。同龄后代将按字典顺序列出。
Sample Input
2 1 Ted Bill 25 4 Ray James 40 James Beelzebub 17 Ray Mark 75 Ted Ray 20
Sample Output
DATASET 1 Bill 75 DATASET 2 Ray 80 James 40 Beelzebub 23 Mark 5
一开始没有找到很好的方法(我太菜了),其实二重循环暴力法就可以简单,题意很简单,就是给出一个100的人,他的孩子和子孙之间年龄关系,只有这个100岁老人有年龄,其他的孩子都必须从这个100数据衍生出来。一个一个去查找暴力就可以解决。
#include<iostream>
#include<bits/stdc++.h>
const int maxn=105;
typedef long long ll;
using namespace std;
string f[maxn];
string c[maxn];
int year[maxn];
typedef struct
{
string name;
int nian;
}point;
point ren[maxn];
bool cmp(point a,point b)
{
if(a.nian!=b.nian)
return a.nian>b.nian;
if(a.name!=b.name)
return a.name<b.name;
}
int main()
{
int i,j;
int t;
cin>>t;
int kase=0;
while(t--)
{
int num;
cin>>num;
for(i=0;i<num;i++)
cin>>f[i]>>c[i]>>year[i];
ren[0].name="Ted";
ren[0].nian=100;
int k=1;
for(i=0;i<num;i++)
{
for(j=0;j<num;j++)
{
if(ren[i].name==f[j])
{
ren[k].name=c[j];
ren[k].nian=ren[i].nian-year[j];
k++;
}
}
}
sort(ren,ren+num+1,cmp);
cout<<"DATASET "<<++kase<<endl;
for(i=1;i<=num;i++)
{
cout<<ren[i].name<<' '<<ren[i].nian<<endl;
}
}
return 0;
}
这个用了3个数组将父亲孩子,和年龄差距都按下标都储存在一维数组和字符串中,只要找到父亲(年龄已经知道),这就可以按下标将孩子,年龄装到一个结构体数组中。最后sort 排一下序就可以了。