http://codeforces.com/problemset/problem/24/B
模拟题。。。直接用set模拟即可
无坑点。。
错误的地方。。。 写映射函数一定要注意每条路径都要return,有些没说明的,可能隐含意思是return 0,否则如果没有return 默认返回随机值,导致WA.
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include<stack>
using namespace std;
const double pi=acos(-1.0);
const double eps=1e-6;
struct node
{
string name;
int level[55];
int point;
node(){name="";point=0;memset(level,0,sizeof(level));}
bool operator <(const node &b) const
{
if (point!=b.point)
return point<b.point;
int i;
for (i=1;i<=50;i++)
{
if (level[i]==b.level[i])continue;
return (level[i]<b.level[i]);
}
}
node(const node& b)
{
name=b.name;
point=b.point;
for (int i=0;i<=50;i++)
level[i]=b.level[i];
}
};
struct cmp
{
bool operator()(const node&a,const node&b)const
{
if (a.level[1]!=b.level[1])
return a.level[1]<b.level[1] ;
if (a.point!=b.point)
return a.point<b.point;
int i;
for (i=2;i<=50;i++)
{
if (a.level[i]==b.level[i])continue;
return (a.level[i]<b.level[i]);
}
}
};
set<node> sb;
set<node,cmp> sb_p;
set<node,cmp>::iterator it_p;
set<node>::iterator it;
int get(int i)
{
if (i==1) return 25;
if (i==2) return 18;
if (i==3) return 15;
if (i==4) return 12;
if (i==5) return 10;
if (i==6) return 8;
if (i==7) return 6;
if (i==8) return 4;
if (i==9) return 2;
if (i==10) return 1;
if (i>10) return 0;
}
set<node>::iterator myfind1 (node&b)
{
set<node>::iterator tt;
for (tt=sb.begin();tt!=sb.end();tt++)
{
if ((*tt).name==b.name) return tt;
}
return sb.end();
}
set<node,cmp>::iterator myfind2 (node&b)
{
set <node,cmp>::iterator tt;
for (tt=sb_p.begin();tt!=sb_p.end();tt++)
{
if ((*tt).name==b.name) return tt;
}
return sb_p.end();
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;getchar();
string ss;
int i;
for (i=1;i<=n;i++)
{
cin>>ss;
node tmp;
tmp.name=ss;
it=myfind1(tmp);
if (it!=sb.end())
{
tmp=*it;
sb.erase(it);
}
tmp.level[i]++;
tmp.point+=get(i);
sb.insert(tmp);
node tt;
tt.name=ss;
it_p=myfind2(tt);
if (it_p!=sb_p.end())
{
tt=*it_p;
sb_p.erase(it_p);
}
tt.point+=get(i);
tt.level[i]++;
sb_p.insert(tt);
}
}
it=sb.end();
if (it!=sb.begin()) it--;
cout<<(it->name)<<endl;
it_p=sb_p.end();
if (it_p!=sb_p.begin()) it_p--;
cout<<(it_p->name)<<endl;
return 0;
}