COGS 898. [咲 -Saki-] 天才麻将少女什么编
★☆ 输入文件:sakinani.in
输出文件:sakinani.out
简单对比
时间限制:1 s 内存限制:256 MB
题目背景
二十一世纪,世界上的麻将竞技人数超过一亿,日本每年也有大规模的全国大赛来对麻将选手进行选拔。从小学到高中,很多学校也设立了麻将部。
《天才麻将少女阿知贺篇 episode of side-A》『咲 -Saki- 阿知賀編 episode of side-A』是《天才麻将少女》『咲 -Saki-』的外传,从另一个视角讲述麻将少女们的故事。故事背景设定在《天才麻将少女》本篇第二主角原村和曾生活的奈良县,主角校为阿知贺女子学院。(有问题?内事百度,外事谷歌)
由于阿知贺人物存在感不够强,导致该作被称为“千里山篇”「怜 -Toki- 千里山編」,甚至 2012 年动画最萌也是千里山的園城寺怜同学。我们一直很疑惑这到底谁是主角,那么就让数据说话吧!
题目要求
我们给出一个人物列表,人物有其所属的学校。比如「松実玄」同学隶属「阿知賀女子学院」什么的。有的人物没有所属学校或没有明确给出其所属,可以无视。
人物每一次出场都会给其学校增加一点存在感。有少数“被牌爱着的孩子”,即“魔物”会有非常高的存在感,出场一次会有普通人出场两次的存在感。
我们需要统计,在给出的人物出场单中,哪个学校存在感最高,我们就把这篇动画命名为什么编。
输入格式
- 输入文件第一行为一个整数 n ,表示有多少人物出现。下面 n 行是人物列表,每两行有两个字符串 A 和 B ,表示人物 A 属于学校 B 。没有同名人物,不会重复出现人物。
- 下面一行一个整数 k ,表示魔物的数量。接下来 k 行,每行一个字符串,表示魔物的姓名,不保证魔物在人物列表中。
- 接下来直到文件末尾,每行有一个字符串(空行不算),表示出场人物,可能会出现不存在于上面列表中的人物。
样例输入
7 宮永咲 清澄高校 原村和 清澄高校 片岡優希 清澄高校 園城寺怜 千里山女子高校 竹井久 清澄高校 天江衣 龍門渕高校 龍門渕透華 龍門渕高校 2 宮永咲 天江衣 原村和 高鴨穏乃 原村和 片岡優希 原村和 宮永咲
输出格式
- 输出只有一行,即存在感最大的学校名称,并列第一则输出编码序小的一个。
样例输出
清澄高校
数据范围及要求
- 对于 70% 的数据,总出现次数不超过 10000。
- 对于 100% 的数据,学校数量不超过 40 ,人物数量不超过 200 ,总出现次数不超过 1000000。
- 对于 40% 的数据,字符串中只有大写和小写字母。
- 对于 100% 的数据,字符串中会存在大小写字母、汉字和日语假名,且长度不超过 100 。为了简化问题,输入输出文件都使用 ANSI 编码(一个东亚字符占两字节)。
模拟
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <string> #define N 1000005 using namespace std; struct node { string name,sch; bool flag; }stu[N]; struct nodE { string sch; int sum; bool operator<(nodE a)const { if(sum==a.sum) return sch<a.sch; else return sum>a.sum; } }sv[N]; bool sq[N]; int n,m,num; int Main() { freopen("sakinani.in","r",stdin); freopen("sakinani.out","w",stdout); scanf("%d",&n); string a,b; for(int i=1;i<=n;++i) { cin>>stu[i].name>>stu[i].sch; for(int j=1;j<=num;++j) { if(sv[j].sch==stu[i].sch) goto flag; } sv[++num].sch=stu[i].sch; flag:; } scanf("%d",&m); for(;m--;) { cin>>a; for(int i=1;i<=n;++i) if(stu[i].name==a) stu[i].flag=true; } while(cin>>a) { b.clear(); int sum=0; for(int i=1;i<=n;++i) if(stu[i].name==a) { b=stu[i].sch; if(stu[i].flag) sum=2; else sum=1; break; } if(!b.size()) continue; for(int i=1;i<=num;++i) if(sv[i].sch==b) sv[i].sum+=sum; } sort(sv+1,sv+1+num); cout<<sv[1].sch; return 0; } int sb=Main(); int main(int argc,char *argv[]) {;}
我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。