1233:接水问题

【题目描述】

学校里有一个水房,水房里一共装有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个整数,表示接水所需的总时间。

【输入样例】

5 3
4 4 1 2 1

【输出样例】

4

【提示】

样例输入#2:

8 4

23 71 87 32 70 93 80 76

样例输出#2:

163

提示:

输入输出样例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秒。


本人思路有点复杂(但好像是正常人思维)(嫌啰嗦可以直接看下面):

// Created on 2020/2/14

/*#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <climits>*/
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int idata=100000+5;
int n,m;
int tim[idata];
int tap[idata];
int cnt;
bool judge;
int flag;
int minn=INT_MAX;
int maxx;
int sum;

int main()
{
    int i,j;

    cin>>n>>m;
    for(i=1;i<=n;i++)
    {
        cin>>tim[i];
    }

    flag=0;
    while(flag!=n)
    {
        minn=999999;
        for(i=1;i<=m;i++)
        {
            if(flag==n)
                break;
            if(tap[i]==0)
            {
                tap[i]=tim[++flag];
            }
        }
        for(i=1;i<=m;i++)
        {
            if(minn>tap[i]&&tap[i]!=0)
                minn=tap[i];
        }
        /*for(i=1;i<=m;i++)
        {
            cout<<tap[i]<<" ";
        }
        cout<<endl;*/
        for(i=1;i<=m;i++)
        {
            if(tap[i]!=0)
                tap[i]-=minn;
        }

        sum+=minn;
        /*for(i=1;i<=m;i++)
        {
            cout<<tap[i]<<" ";
        }
        cout<<endl;
        cout<<sum<<endl;*/
    }

    for(i=1;i<=m;i++)
    {
        if(tap[i]>maxx)
            maxx=tap[i];
    }
    cout<<sum+maxx<<endl;
    return 0;
}

再看大佬思路:(给最少的水龙头加时间)怪简单的

// Created on 2020/2/14

/*#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <climits>*/
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int idata=100000+5;
int n,m;
int tim[idata];
int tap[idata];
int cnt;
bool judge;
int flag;
int minn=INT_MAX;
int maxx;
int sum;

int main()
{
    int i,j;

    cin>>n>>m;
    for(i=1;i<=n;i++)
    {
        cin>>tim[i];
    }

    for(i=1;i<=m;i++)
    {
        tap[i]=tim[i];
    }
    for(i=m+1;i<=n;i++)
    {
        minn=99999999;
        for(j=1;j<=m;j++)
        {
            if(minn>tap[j])
            {
                minn=tap[j];
                flag=j;
            }
        }
        tap[flag]+=tim[i];
    }

    for(i=1;i<=m;i++)
    {
        if(maxx<tap[i])
            maxx=tap[i];
    }

    cout<<maxx<<endl;
    return 0;
}
发布了189 篇原创文章 · 获赞 8 · 访问量 7230

猜你喜欢

转载自blog.csdn.net/C_Dreamy/article/details/104306728
今日推荐