2020暑假牛客多校第九场 K The Flee Plan of Groundhog (树形结构/思维)

The Flee Plan of Groundhog

https://ac.nowcoder.com/acm/contest/5674/K

The Flee Plan of Groundhog

题目大意:
有一个土拨鼠在节点1,一个橘子在节点n,在t时刻之前土拨鼠向着n走,橘子不动,从t时刻开始,橘子开始抓土拨鼠,土拨鼠开始跑,土拨鼠 1m/s 橘子 2m/s,问还有多长时间橘子才能抓到土拨鼠。

解题思路:
t 时刻之后,土拨鼠必然朝着n的反方向移动,土拨鼠走一步,橘子走两步,那么我们可以记录一下t时刻土拨鼠的位置,还有土拨鼠向反方向最多能跑多远。如果土拨鼠向后跑了一步就到头了,那么显然答案是橘子到该点的距离/2向上取整,但是如果土拨鼠可以向后跑很多步,在跑的过程中被逮住了,那么答案就是土拨鼠往后跑的距离的时间。

  • 土拨鼠向后跑到了最远处没法再跑蹲躲在角落等着橘子来抓
  • 土拨鼠向后跑的过程中被橘子逮住了

分类讨论一下即可。

Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=500000;

vector<int> ve[maxn];
int dis[maxn],f[maxn],m,ed=1,maxx=0;

void dfs(int x,int pre,int val){  //记录下每个点到n的距离 
    f[x]=pre;
    dis[x]=val;
    for(int i=0;i<ve[x].size();i++){
        if(ve[x][i]==pre) continue;
        dfs(ve[x][i],x,val+1);
    }
}

void dfs2(int x,int pre){
    maxx=max(maxx,dis[x]);      //从t时间所在地点往n点相反的方向跑最远是多少
    for(int i=0;i<ve[x].size();i++){
        if(ve[x][i]==pre) continue;
        dfs2(ve[x][i],x);
    }
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);

    int t,n,tmp=1;
    cin>>n>>m;
    for(int i=1;i<n;i++)
    {
        int u,v;
        cin>>u>>v;
        ve[u].push_back(v);
        ve[v].push_back(u);
    }
    dfs(n,n,0);
    while(m--) tmp=f[tmp];  //找出土拨鼠的t时间所在的节点 
    dfs2(tmp,f[tmp]);

    int x=maxx-dis[tmp];      
    int y=dis[tmp];          // 拨鼠的t时间所在的节点到n的距离 

    if(tmp==n) cout<<"0\n";        //土拨鼠在t时间之前到了n点 
    else if(x-y>=0) cout<<max(1,y)<<endl; //土拨鼠跑到最远点之前被橘子逮住了 
    else cout<<max(1,(maxx+1)/2)<<endl;  // 土拨鼠跑到最远点了然后没法再跑了,躲在角落等着橘子来抓 


    return 0;
}
全部评论
博主你好。有个问题 28 4 1 12 12 11 11 10 10 9 9 2 2 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 2 3 3 4 4 5 5 6 6 7 7 8 8 13 13 14 14 15 这个数据应该输出的是11吧,但是你的程序是9。按照我的样例,在t=4时,土拨鼠在节点9,实际上土拨鼠会往橘子方向走近一步来到节点2然后进入3-4-5-6...这个分叉会更优,但是你的程序应该就是直接反方向从9跑回1然后等着被抓。
点赞 回复 分享
发布于 2020-10-15 16:31
请问一下,土拨鼠万一是先向橘子那边跑,然后朝更远方向跑的情况会不会有?如果土拨鼠跑了t秒之后两者深度差仍然足够大的话,直接往子节点跑应该会出现端点不够深导致土拨鼠不能继续往下跑等死的情况吧。。
点赞 回复 分享
发布于 2020-08-08 23:48

相关推荐

06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务