团体程序设计天梯赛-练习集L2篇⑨

简介: 团体程序设计天梯赛-练习集L2篇⑨

70cc977fd4e242d1b2ded47c6c3938da.png下面是PTA的OJ平台

PTA的OJ平台(点击我直跳)

题解

L2-030 冰岛人

2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名。好事者发现冰岛人的名字后面似乎都有个“松”(son),于是有网友科普如下:

冰岛人沿用的是维京人古老的父系姓制,孩子的姓等于父亲的名加后缀,如果是儿子就加 sson,女儿则加 sdottir。因为冰岛人口较少,为避免近亲繁衍,本地人交往前先用个 App 查一下两人祖宗若干代有无联系。本题就请你实现这个 App 的功能。


输入格式:

输入首先在第一行给出一个正整数 N(1<N≤10

5

),为当地人口数。随后 N 行,每行给出一个人名,格式为:名 姓(带性别后缀),两个字符串均由不超过 20 个小写的英文字母组成。维京人后裔是可以通过姓的后缀判断其性别的,其他人则是在姓的后面加 m 表示男性、f 表示女性。题目保证给出的每个维京家族的起源人都是男性。


随后一行给出正整数 M,为查询数量。随后 M 行,每行给出一对人名,格式为:名1 姓1 名2 姓2。注意:这里的姓是不带后缀的。四个字符串均由不超过 20 个小写的英文字母组成。


题目保证不存在两个人是同名的。


输出格式:

对每一个查询,根据结果在一行内显示以下信息:


若两人为异性,且五代以内无公共祖先,则输出 Yes;

若两人为异性,但五代以内(不包括第五代)有公共祖先,则输出 No;

若两人为同性,则输出 Whatever;

若有一人不在名单内,则输出 NA。

所谓“五代以内无公共祖先”是指两人的公共祖先(如果存在的话)必须比任何一方的曾祖父辈分高。


输入样例:

15

chris smithm

adam smithm

bob adamsson

jack chrissson

bill chrissson

mike jacksson

steve billsson

tim mikesson

april mikesdottir

eric stevesson

tracy timsdottir

james ericsson

patrick jacksson

robin patricksson

will robinsson

6

tracy tim james eric

will robin tracy tim

april mike steve bill

bob adam eric steve

tracy tim tracy tim

x man april mikes

输出样例:

Yes

No

No

Whatever

Whatever

NA


AC代码:

#include<bits/stdc++.h>
#define sex first
#define ne second
using namespace std;
typedef pair<bool,string> PBS;
map<string,PBS> names;
string fname,sname;
bool check(string a,string b){
  map<string,int> ss;
  int cnt1 = 1;
  while(a.size()){
    ss[a] = cnt1; 
    a = names[a].ne;
    cnt1++;
  }
  int cnt2 = 1;
  while(b.size()){
    if(ss.count(b)) {
      //两人的公共祖先(如果存在的话)必须比任何一方的曾祖父辈分高。
      if(ss[b] < 5 || cnt2 < 5) return false;
      else return true;
    } 
    b = names[b].ne;
    cnt2++;
  }
  return true;
}
int main(){
    int n; cin>>n;
    for(int i = 1; i <= n; i++){
      cin>>fname>>sname;
      char c = sname.back();
      if(c == 'n'){
        names[fname] = {1,sname.substr(0,sname.size()-4)};
    } else if(c == 'r'){
      names[fname] = {0,sname.substr(0,sname.size()-7)};
    } else if(c == 'm'){
      names[fname].first = 1;
    } else {
      names[fname].first = 0;
    }
  }
    int k; cin>>k;
    string n1,n2,tmp;
    while(k--) {
      cin>>n1>>tmp>>n2>>tmp;
      if(!names.count(n1) || !names.count(n2)) puts("NA");
      else if(names[n1].sex == names[n2].sex) puts("Whatever");
      else if(check(n1,n2)) puts("Yes");
      else puts("No");
  }
    return 0;
}

L2-031 深入虎穴

著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报。已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门。每一扇门背后或者是一个房间,或者又有很多条路,同样是每条路通向一扇门…… 他的手里有一张表格,是其他间谍帮他收集到的情报,他们记下了每扇门的编号,以及这扇门背后的每一条通路所到达的门的编号。007 发现不存在两条路通向同一扇门。


内线告诉他,情报就藏在迷宫的最深处。但是这个迷宫太大了,他需要你的帮助 —— 请编程帮他找出距离入口最远的那扇门。


输入格式:

输入首先在一行中给出正整数 N(<10

5

),是门的数量。最后 N 行,第 i 行(1≤i≤N)按以下格式描述编号为 i 的那扇门背后能通向的门:


K D[1] D[2] … D[K]

其中 K 是通道的数量,其后是每扇门的编号。


输出格式:

在一行中输出距离入口最远的那扇门的编号。题目保证这样的结果是唯一的。


输入样例:

13

3 2 3 4

2 5 6

1 7

1 8

1 9

0

2 11 10

1 13

0

0

1 12

0

0

输出样例:

12


AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
vector<int>g[N];
int res[N];
void dfs(int u,int cnt)
{
  res[u]=cnt;
  for(int i=0;i<g[u].size();i++)
  {
    dfs(g[u][i],cnt+1);
  }
}
int main()
{
  int n;
  cin>>n;
  for(int i=1;i<=n;i++)
  {
    int k;
    cin>>k;
    for(int j=0;j<k;j++)
    {
      int x;
      cin>>x;
      res[x]=1;
      g[i].push_back(x);
    }
  }
  int h;
  for(int i=1;i<=n;i++)
  {
    if(!res[i])
    {
      h=i;
      break;
    }
  }
  dfs(h,1);
  int maxn=0;
  int ans=0;
  for(int i=1;i<=n;i++)
  {
    if(res[i]>maxn)
    {
      maxn=res[i];
      ans=i;
    }
  }
  cout<<ans;
}

L2-032 彩虹瓶

ae668e4085674e2da81a3af892183fe9.png

彩虹瓶的制作过程(并不)是这样的:先把一大批空瓶铺放在装填场地上,然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里。


假设彩虹瓶里要按顺序装 N 种颜色的小球(不妨将顺序就编号为 1 到 N)。现在工厂里有每种颜色的小球各一箱,工人需要一箱一箱地将小球从工厂里搬到装填场地。如果搬来的这箱小球正好是可以装填的颜色,就直接拆箱装填;如果不是,就把箱子先码放在一个临时货架上,码放的方法就是一箱一箱堆上去。当一种颜色装填完以后,先看看货架顶端的一箱是不是下一个要装填的颜色,如果是就取下来装填,否则去工厂里再搬一箱过来。


如果工厂里发货的顺序比较好,工人就可以顺利地完成装填。例如要按顺序装填 7 种颜色,工厂按照 7、6、1、3、2、5、4 这个顺序发货,则工人先拿到 7、6 两种不能装填的颜色,将其按照 7 在下、6 在上的顺序堆在货架上;拿到 1 时可以直接装填;拿到 3 时又得临时码放在 6 号颜色箱上;拿到 2 时可以直接装填;随后从货架顶取下 3 进行装填;然后拿到 5,临时码放到 6 上面;最后取了 4 号颜色直接装填;剩下的工作就是顺序从货架上取下 5、6、7 依次装填。


但如果工厂按照 3、1、5、4、2、6、7 这个顺序发货,工人就必须要愤怒地折腾货架了,因为装填完 2 号颜色以后,不把货架上的多个箱子搬下来就拿不到 3 号箱,就不可能顺利完成任务。


另外,货架的容量有限,如果要堆积的货物超过容量,工人也没办法顺利完成任务。例如工厂按照 7、6、5、4、3、2、1 这个顺序发货,如果货架够高,能码放 6 只箱子,那还是可以顺利完工的;但如果货架只能码放 5 只箱子,工人就又要愤怒了……


本题就请你判断一下,工厂的发货顺序能否让工人顺利完成任务。


输入格式:

输入首先在第一行给出 3 个正整数,分别是彩虹瓶的颜色数量 N(1<N≤10

3

)、临时货架的容量 M(<N)、以及需要判断的发货顺序的数量 K。


随后 K 行,每行给出 N 个数字,是 1 到N 的一个排列,对应工厂的发货顺序。


一行中的数字都以空格分隔。


输出格式:

对每个发货顺序,如果工人可以愉快完工,就在一行中输出 YES;否则输出 NO。


输入样例:

7 5 3

7 6 1 3 2 5 4

3 1 5 4 2 6 7

7 6 5 4 3 2 1

输出样例:

YES

NO

NO


AC代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
  int n,m,k;
  cin>>n>>m>>k;
  for(int i=1;i<=k;i++)
  {
    vector<int>v(n+2);
    for(int j=1;j<=n;j++)
      cin>>v[j];
    stack<int>s;
    int judge=1,head=1,tail=1;
    while(head<=n)
    {
      if(tail<=n&&head==v[tail])
      {
        head++;
        tail++;
      }
      else if(!s.empty()&&s.top()==head)
      {
        s.pop();
        head++;
      }
      else if(s.size()<m&&tail<=n)
        s.push(v[tail++]);
      else
      {
        judge=0;
        break;
      }
    }
    if(judge)
      cout<<"YES"<<endl;
    else
      cout<<"NO"<<endl;             
  }
}

写在最后

🍉🍉🍉不必偏执于未知的真实,身处的当下即是意义和真实,爱才是解题的答案,也是刻画人生色彩的笔尖,耐心的走下去,总会遇到你爱的人和爱你的人。


🍁🍁🍁好啦,本文的内容就到此结束啦,我们下期再见哦!另外在祝各位小伙伴们要天天开心哦!

🍂🍂🍂如果你觉得本文对你有帮助的话,还请不要吝惜您的三连哦!您的支持就是我创作的最大动力!!爱你们💕💕💕

相关文章
|
8月前
团体程序设计天梯赛-练习集L2篇⑦
团体程序设计天梯赛-练习集L2篇⑦
40 0
|
8月前
|
Perl
团体程序设计天梯赛-练习集L1篇③
团体程序设计天梯赛-练习集L1篇③
99 0
|
8月前
|
测试技术
团体程序设计天梯赛-练习集L2篇⑥
团体程序设计天梯赛-练习集L2篇⑥
59 0
PTA团体程序设计天梯赛-练习集 L3-009 长城 (计算几何)
PTA团体程序设计天梯赛-练习集 L3-009 长城 (计算几何)
128 0
PTA团体程序设计天梯赛-练习集 L3-009 长城 (计算几何)
PTA团体程序设计天梯赛-练习集 L2 网红点打卡攻略(模拟)
PTA团体程序设计天梯赛-练习集 L2 网红点打卡攻略(模拟)
134 0
7-10 排座位 —— 程序设计天梯赛
布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位。无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席。
130 0
7-10 排座位 —— 程序设计天梯赛
|
存储 大数据
团体程序设计天梯赛(下)
团体程序设计天梯赛(下)
342 0
团体程序设计天梯赛(下)
|
算法 安全 定位技术
团体程序设计天梯赛(上)
团体程序设计天梯赛
391 0
团体程序设计天梯赛(上)