团体程序设计天梯赛-练习集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;             
  }
}

写在最后

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


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

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

相关文章
|
数据可视化 定位技术
three.js实现烟雾缭绕效果
前言 大家好!我是Fly哥,最近接广告的接的有点多, 感谢大家还是一如既往的支持我!respect, 前几天我在朋友圈分享了一个烟雾缭绕的效果。很多小伙伴都表示非常感兴趣,有的同学说用到了噪声, 有的同学说用到了着色器,还有更过分说用到了ps, 胖虎竟然无语凝噎。其实都是就是简单的贴图。配合一点想象力。我们先看下效果: 然后我就发了一条朋友圈,问这个像什么?? 有的说 云层, 有的说云墨,有的说雾霭, 其实都不是, 我想做的是烟雾。好的话不不多说!, 本篇文章阅读大概5分钟。不耽误大家太多时间,主要是介绍思路, 说太多也没啥意义。如果你对three.js 还没有一点了解都没有,
three.js实现烟雾缭绕效果
|
8月前
|
人工智能 自然语言处理 机器人
AI心语:智能时代的情感纽带
本文旨在探索人工智能在情感计算领域的应用,以及这些技术如何帮助我们更好地理解和模拟人类情感。通过分析当前的技术进展和面临的伦理挑战,文章为读者提供了一个关于AI与情感结合世界的全面视角。
667 6
|
11月前
|
存储 定位技术
【天梯赛】L2-048 寻宝图 (DFS做法)
遇到一个非'0'字符(也就是'1'和 宝藏'2'到'9')就让ans++,同时将这个非'0'字符染色为'0',然后往四个方向(上、下、左、右)搜索,这里的目的是那一片岛屿(也就是那一片为'1'的部分)都染色为‘0’。本题就请你统计一下,给定的地图上一共有多少岛屿,其中有多少是有宝藏的岛屿。为了判断有宝藏的岛屿,这里我开了一个全局变量f来判断这一片岛屿是否有宝藏(也就是有无字符'2'-'9'),当搜到字符'2'~'9'时就将f标记为1。在一行中输出 2 个整数,分别是岛屿的总数量和有宝藏的岛屿的数量。
268 5
|
11月前
|
运维 弹性计算 容器
阿里云操作系统智能助手OS Copilot实验测评
文章指出了阿里云引导文档的若干改进点,如明确服务器选择、细化安全组添加说明、清晰标注AccessKey ID和Secret的格式。OS Copilot产品在运维任务、故障排查等方面表现优秀,获得满分好评,尤其知识问答功能受青睐。尽管新手引导有待完善,但用户愿意推荐并参与开发。期望OS Copilot支持更多操作系统、自动分析命令错误及增强系统错误排查。产品可与ACK、ECS、Workbench等联动,提升云服务管理和开发效率。总结认为,产品对日常工作有显著帮助,建议增强细节指导和错误处理。
132 0
阿里云操作系统智能助手OS Copilot实验测评
|
Docker 容器
docker 换国内镜像源,docker换源
docker 换国内镜像源,docker换源
8359 5
|
开发工具 git
完美解决 fatal: unable to access ‘https://github.com/.../.git‘: Could not resolve host: github.com
完美解决 fatal: unable to access ‘https://github.com/.../.git‘: Could not resolve host: github.com
33381 1
|
存储 算法 调度
【CCCC】PAT : 团体程序设计天梯赛-练习集 L2 答案,题解,附代码
【CCCC】PAT : 团体程序设计天梯赛-练习集 L2 答案,题解,附代码
764 0
|
人工智能 安全 C++
实测文心一言4.0,真的比GPT-4毫不逊色吗?(一)
实测文心一言4.0,真的比GPT-4毫不逊色吗?
1070 0
|
SQL Windows
Windows 下80端口被进程 System & PID=4 占用的解决方法
Windows 下80端口被进程 System & PID=4 占用的解决方法
1600 0
OSZAR »