zoukankan      html  css  js  c++  java
  • 小朋友传糖-递归算法

    问题:

    童年的我们,将和朋友分享美好的事物作为自己的快乐。这天,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;
    }

     

  • 相关阅读:
    python—logger
    print默认在末尾添加一个换行符,但其实也可以不用!
    Python做int()强制类型转换的时候,小数是如何取舍的?
    Python基础之好玩的字符串格式化f-string格式
    【奔走相告】- Github送福利:用户可免费创建私有代码库啦
    我30岁了,转行学编程可以吗? 排除法告诉你答案
    Python基础之好玩的字符串格式化之类C风格
    Python基础之白话说函数
    变量 和 注释
    什么是编程语言,什么是Python解释器
  • 原文地址:https://www.cnblogs.com/xxaf/p/12793474.html
Copyright © 2011-2022 走看看