分糖果

分糖果

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 18   Accepted Submission(s) : 3

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

童年的我们将和朋友分享美好的事物作为自己的快乐。这天,C小朋友得到了糖果,将要把这些糖果分给要好的朋友们。已知糖果从一个人传给还有一个人须要1秒的时间,同一个小朋友不会反复接受糖果。因为糖果足够多,假设某时刻某小朋友接受了糖果。他会将糖果分成若干份,分给那些在他身旁且还没有得到糖果的小朋友们,并且自己会吃一些糖果。因为嘴馋,小朋友们等不及将糖果发完,会在得到糖果后边吃边发。每一个小朋友从接受糖果到吃完糖果须要m秒的时间。那么,假设第一秒C小朋友開始发糖,第几秒全部小朋友都吃完了糖呢?

Input

输入有多组数据,每组数据第1行为三个数n(<=10000),p(<=600000),c为小朋友数,关系数和C小朋友的编号。

第2行为一个数m(<=8000),表示小朋友吃糖的时间。

以下p行每行两个整数,表示某两个小朋友在彼此身旁。

Output

对于每组输入输出一个单独的整数表示从Ts到Te的最小总费用。数据保证至少存在一条道路。

Sample Input

4 3 1
2
1 2
2 3
1 4

Sample Output

5

Hint
第一秒,糖在1手上。第二秒,糖传到了2、4的手中。第三秒。糖传到了3的手中,此时1吃完了。第四秒,2、4吃完了。

第五秒。3吃完了。所以答案是5。

Author

HYNU

//思路就是找出与1相隔最远的那个点到1的距离,首先把每一条路径的权值都标记为1。找出最远点加上m就是答案。由于最后一个人吃糖须要m时间,假设最后这个这个人都吃完了,那他前面的人肯定已经吃完了。 在找的时候用到的是图的广度优先搜索,由于n非常大。那么使用vector动态数组来存储边。

#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
vector<int>num[10001];
queue<int>q;
int vis[10001],f[10001];
void bfs()
{
    int i,t;
    while(!q.empty())
    {
        t=q.front();
        q.pop();
        for(i=0;i<num[t].size();i++)
        {
            if(!vis[num[t][i]])
            {
                vis[num[t][i]]=1;
                f[num[t][i]]=f[t]+1;
                q.push(num[t][i]);
            }
        }
    }
}

int main()
{
    int n,p,c,m,i,a,b;
    while(scanf("%d%d%d%d",&n,&p,&c,&m)!=EOF)
    {
        for(i=0;i<=n;i++)
            num[i].clear();
        memset(vis,0,sizeof(vis));
        memset(f,0,sizeof(f));
        while(!q.empty()) q.pop();
        for(i=0;i<p;i++)
        {
            scanf("%d%d",&a,&b);
            num[a].push_back(b);
            num[b].push_back(a);
        }
        q.push(c);
        vis[c]=1;
        f[c]=1;
        bfs();
        int ans=0;
        for(i=1;i<=n;i++)
        {
            if(f[i]>ans) ans=f[i];
            //printf("%d\n",f[i]);
        }
        printf("%d\n",ans+m);
    }
    return 0;
}

版权声明:本文博主原创文章。博客,未经同意不得转载。

时间: 2024-08-05 19:29:56

分糖果的相关文章

【蓝桥杯】PREV-32 分糖果

题目链接:http://lx.lanqiao.org/problem.page?gpid=T124 历届试题 分糖果 时间限制:1.0s   内存限制:256.0MB 问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一半给左手边的孩子. 一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数. 反复进行这个游戏,直到所有小朋友的糖果数都相同为止. 你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果. 输入格

蓝桥-分糖果(算法训练)

1 /* 2 蓝桥-分糖果 3 测试通过 4 时间:2015-9-22 5 6 问题描述 7 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 8 9 每个小朋友都把自己的糖果分一半给左手边的孩子. 10 11 一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数. 12 13 反复进行这个游戏,直到所有小朋友的糖果数都相同为止. 14 15 你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果. 16 输入格式 17 程序首先读入一个整数N(

1503140001-蓝桥杯-历届试题 分糖果

历届试题 分糖果 时间限制:1.0s   内存限制:256.0MB 问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一半给左手边的孩子. 一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数. 反复进行这个游戏,直到所有小朋友的糖果数都相同为止. 你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果. 输入格式 程序首先读入一个整数N(2<N<100),表示小朋友的人数. 接着是一行用空格分开的N个偶数(

HNUSTOJ-1639 分糖果(几何)

1639: 分糖果 时间限制: 1 Sec  内存限制: 128 MB提交: 261  解决: 118[提交][状态][讨论版] 题目描述 为了实验室的发展,吴大大采购了一箱零食O(∩_∩)O~~ 在吴大大取快递的时候,实验室已经已经默默地聚集了一堆吃货,准备抢劫他,为了避免发生由一袋零食引发的血案,同时也是为了体现我们实验室的和谐,在实验室的N个人达成了一个协议:等吴大大一回来,大家就包围他!但是每个人必须保证距离吴大大1m,并且相邻两人间的距离相等. 但是实验室的N个人都不知道怎么站更加合适

C语言 &#183; 分糖果

历届试题 分糖果 时间限制:1.0s   内存限制:256.0MB 问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一半给左手边的孩子. 一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数. 反复进行这个游戏,直到所有小朋友的糖果数都相同为止. 你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果. 输入格式 程序首先读入一个整数N(2<N<100),表示小朋友的人数. 接着是一行用空格分开的N个偶数(

蓝桥杯 - 分糖果 (模拟~)

历届试题 分糖果 时间限制:1.0s   内存限制:256.0MB 问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一半给左手边的孩子. 一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数. 反复进行这个游戏,直到所有小朋友的糖果数都相同为止. 你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果. 输入格式 程序首先读入一个整数N(2<N<100),表示小朋友的人数. 接着是一行用空格分开的N个偶数(

hunnu11543:小明的烦恼——分糖果

Problem description   小明在班里一直是个非常公正的孩子.这点同学和老师都非常清楚,这不,老师每周都会从家里带来一些糖果.然后叫小明把糖果分给其它小朋友,但这个班里的同学都有一个非常特别的性格,就是他们仅仅喜欢偶数.对于糖果也一样,所以小明在分糖果时也必需要保证这一点,即使每一个同学分的糖果数量不一样.都是奇怪的是,小明有时候并不可以合格的分糖果,这让他大为苦恼.害怕别的同学会不再信任他(虽然其它同学不会这么想).所以他想请你帮帮他.在每次老师把糖果给他时,就帮他推断出糖果能

分糖果游戏

十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩20块.然后所有的小孩同时将自已手中的糖分一半给右边的小孩,糖块数为奇数的人可向老师要一块,问经过这样几次调整后大家手中的糖的块数都一样多?每人各有多少块糖? public class test2 { public void shareSweet75() {            int[] boy = 

[LeetCode] Candy (分糖果),时间复杂度O(n),空间复杂度为O(1),且只需遍历一次的实现

[LeetCode] Candy (分糖果),时间复杂度O(n),空间复杂度为O(1),且只需遍历一次的实现 原题: There are N children standing in a line. Each child is assigned a rating value. You are giving candies to these children subjected to the following requirements: Each child must have at least