天是泰德诞辰100周年。几个星期前,你被家人选中与所有泰德的后代联系并组织了一个惊喜派对。为了使这项任务更容易,您创建了一个年龄优先的列表,其中包含来自Ted的所有人。同一年龄的后代按字典顺序列出。您唯一需要帮助的材料是出生证明。奇怪的是,这些出生证明没有过时。他们只是列出了父亲的名字,孩子的名字,以及父亲出生时父亲的确切年龄。
Input:
对此问题的输入将以包含单个整数n的行开始,该整数n表示数据集的数量。每个数据集将根据以下描述进行格式化。单个数据集有2个组件:Descendant Count - 包含单个整数X(其中0 <X <100)的行,表示Ted后代的数量。出生证明书清单 - X出生证明的数据,每行有一个证书的数据。每个证书的数据格式为“FNAME CNAME FAGE”,其中:FNAME是父亲的名字。CNAME是孩子的名字。FAGE是CNAME出生之日父亲的整数年龄。注意:名称是个人的唯一标识符,不包含嵌入的空格。泰德的所有后代都分享了泰德的生日。因此,任何两者之间的年龄差异是整数年。(对于那些非常挑剔的人,假设他们都出生在他们出生年份的完全相同的小时,分钟,秒等等。)你有所有泰德后代的出生证明(一个完整的集合)。
Output:
对于每个数据集,将有X + 1行输出。第一个将读取“DATASET Y”,其中第一个数据集的Y为1,第二个数据为2,等等。随后的X行使用“NAME AGE”格式构成Ted的后代及其年龄的年龄优先列表”。相同年龄的后代将按字典顺序列出。
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
#include<bits/stdc++.h>
using namespace std;
struct Ted
{
string fname;
string cname;
int age;
/* data */
}ted[101];
vector<struct Ted>vt;
typedef pair<int,string>p;
vector<pair<int,string> >vp;
int cmp(p V1,p V2){
if(V1.first==V2.first)
return V1.second>V2.second;
}
int main()
{
int o;
cin>>o;
int u=1;
while(o--)
{
int n,temp=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>ted[i].fname>>ted[i].cname>>ted[i].age;
if(strcmp(ted[i].fname.c_str(),"Ted")==0){
int sum=100-ted[i].age;
vp.push_back(p(sum,ted[i].cname));
}else
vt.push_back(ted[i]);
}
while(!vt.empty()){
p te=vp[temp];
for(int i=0;i<vt.size();i++){
if(strcmp(te.second.c_str(),vt[i].fname.c_str())==0)
{
int Age=te.first-vt[i].age;
vp.push_back(p(Age,vt[i].cname));
vector<struct Ted>::iterator it = vt.begin()+i;
vt.erase(it);
}
}
temp++;
}
sort(vp.begin(),vp.end(),cmp);
cout<<"DATASET "<<u<<endl;
for(int i=vp.size()-1;i>=0;i--)
{
cout<<vp[i].second<<" "<<vp[i].first<<endl;
}
vp.clear();vt.clear();
u++;
}
return 0;
}