• 小朋友传糖-递归算法


    问题:

    童年的我们,将和朋友分享美好的事物作为自己的快乐。这天,C小朋友得到了Plenty  of  candies,将要把这些糖果分给要好的朋友们。已知糖果从一个人传给另一个人需要1  秒的时间,同一个小朋友不会重复接受糖果。由于糖果足够多,如果某时刻某小朋友接受了糖果,他会将糖果分成若干份,分给那些在他身旁且还没有得到糖果的小朋友们,而且自己会吃一些糖果。由于嘴馋,小朋友们等不及将糖果发完,会在得到糖果后边吃边发。每个小朋友从接受糖果到吃完糖果需要m秒的时间。那么,如果第一秒C小朋友开始发糖,第多少秒所有小朋友都吃完了糖呢?

    思路:

    一个小朋友吃糖时间为m s,传糖时间为1 s,并且是边吃边传。我们可以将它们分开,先吃糖后传糖,就变成了吃糖时间为m-1 s,在传糖1 s。

    过程:

    假设我们有四个小朋友,他们编号为:1,2,3,4,他们彼此站位是:4  3  2  1。3号小朋友先传糖给4号和2号,2号再给1号。

    总时间 t = m-1+1+m-1+1+m-1=3*m-1 (2号和4号同时吃糖)

    代码:

    #include<iostream>
    
    using namespace std;
    int t=0;
    int abc(int a[][2],int *h,int n,int p,int m,int C)  //关系  吃糖记录  人数  关系个数  吃糖时间  传糖的人
    {
        int temp=0;
        h[C]=1;    //吃糖
        t=t+m;       //吃糖时间
        for(int i=1; i<=p; i++)
        {
            if(a[i][0]==C && h[a[i][1]]!=1)    //传糖的人并且被传糖的人没有吃过糖
            {
                temp++;
                abc(a,h,n,p,m,a[i][1]);        //传糖
            }
            else if(a[i][1]==C && h[a[i][0]]!=1)
            {
                temp++;
                abc(a,h,n,p,m,a[i][0]);
            }
        }
        if(temp!=0)
        {
            t++;
        }
        if(temp>1)
        {
            t-=m;
        }
        return -1;
    }
    int main()
    {
        int n,p,c;    //小朋友数 关系数 c小朋友编号
        int m;        //吃糖时间
        cin>>n>>p>>c;
        cin>>m;
        int h[1000]={0};       //小朋友
        int a[1000][2];        //关系
        for(int i=1; i<=p; i++)   
        {
            cin>>a[i][0]>>a[i][1];
        }
        abc(a,h,n,p,m-1,c);
        cout<<t;
        return 0;
    }

     

  • 相关阅读:
    linux c 链接详解3-静态库
    ubuntu下安装chrome谷歌浏览器
    零填充(Zero-padding)
    单例模式的多种写法(线程安全)
    执行代码出现ImportError:attempted relative import with no known parent package
    用anaconda安装tensorflow
    A* 算法的原理
    梯度消失(vanishing gradient)和梯度爆炸(exploding gradient)
    spark安装
    [转]虚拟机VMware3种网络模式(桥接、nat、Host-only)的工作原理
  • 原文地址:https://www.cnblogs.com/xxaf/p/12793474.html
Copyright © 2020-2023  润新知