| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1157 人关注过本帖
标题:c++一题不会,谁知道?2010
只看楼主 加入收藏
hzr
Rank: 2
等 级:论坛游民
威 望:3
帖 子:53
专家分:76
注 册:2017-8-24
结帖率:33.33%
收藏
已结贴  问题点数:20 回复次数:1 
c++一题不会,谁知道?2010
学校里有一个水房,水房里一共装有 m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为 1。
现在有 n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从 1到 n 编号,i号同学的接水量为 wi。接水开始时,1 到 m号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学 j 完成其接水量要求 wj 后,下一名排队等候接水的同学 k马上接替 j 同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即j 同学第x 秒结束时完成接水, 则 k 同学第 x+1 秒立刻开始接水。 若当前接水人数 n’不足 m,则只有 n’个龙头供水,其它 m−n’个龙头关闭。
现在给出 n名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。

输入格式:
第 1 行2 个整数 n 和 m,用一个空格隔开,分别表示接水人数和龙头个数。
第 2 行 n 个整数 w1、w2、……、wn,每两个整数之间用一个空格隔开,wi表示 i 号同学的接水量。
输出格式:
输出只有一行,1 个整数,表示接水所需的总时间。
样例输入:
样例1
5 3
4 4 1 2 1

样例2
8 4
23 71 87 32 70 93 80 76
样例输出:
样例1
4

样例2
163

数据范围:
1 ≤ n ≤ 10000,1 ≤m≤ 100 且 m≤ n;
1 ≤wi ≤ 100。
时间限制:
1S
空间限制:
128M
提示:
样例1
第 1 秒,3 人接水。第 1秒结束时,1、2、3 号同学每人的已接水量为 1,3 号同学接完水,4 号同学接替 3 号同学开始接水。
第 2 秒,3 人接水。第 2 秒结束时,1、2 号同学每人的已接水量为 2,4 号同学的已接水量为 1。
第 3 秒,3 人接水。第 3 秒结束时,1、2 号同学每人的已接水量为 3,4 号同学的已接水量为 2。4号同学接完水,5 号同学接替 4 号同学开始接水。
第 4 秒,3 人接水。第 4 秒结束时,1、2 号同学每人的已接水量为 4,5 号同学的已接水量为 1。1、2、5 号同学接完水,即所有人完成接水。
总接水时间为 4 秒。
搜索更多相关主题的帖子: 同学 结束 整数 表示 输出 
2017-10-14 21:54
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:20 
这题我没看出需要什么算法,就是按步写代码呗
一个优先队列(priority_queue),存入m个数,然后将 wi 依次加入到这个队列的最小元素上

C语言中没有优先队列也没关系,反正m最大才100。
程序代码:
#include <limits.h>

unsigned foo( unsigned n, unsigned m, const unsigned w[] )
{
    unsigned s = 0;
    unsigned t[100] = { 0 };
    unsigned w_idx = 0;
    while( w_idx != n )
    {
        unsigned minval = UINT_MAX;
        for( unsigned i=0; i!=m && w_idx!=n; ++i )
        {
            if( t[i] == s )
                t[i] += w[w_idx++];
            minval = t[i]<minval ? t[i] : minval;
        }
        s = minval;
    }

    s = 0;
    for( unsigned i=0; i!=m; ++i )
        s = t[i]>s ? t[i] : s;

    return s;
}

#include <assert.h>

int main( void )
{
    {
        unsigned n=5, m=3, w[10000]={4, 4, 1, 2, 1};
        unsigned r = foo( n, m, w );
        assert( r == 4 );
    }

    {
        unsigned n=8, m=4, w[10000]={23, 71, 87, 32, 70, 93, 80, 76};
        unsigned r = foo( n, m, w );
        assert( r == 163 );
    }

    return 0;
}

2017-10-16 09:21
快速回复:c++一题不会,谁知道?2010
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015127 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved