接水问题用c语言来解决

img

img


这是我在研究贪心算法遇到的一题,由于我还没学数据结构与算法,而CSDN上大家很少用c语言来解决的,且注释不够详细,有点看不懂,请用数组的方式来解答,并详细注释每一步的原理,谢谢!

C跟C++的逻辑是一样的,区别只在于输入和输出不一样。
代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
//水房打水问题
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, m; //人数和水龙头数
    int* w, * p;
    int i, j;
    int time = 0;
    int next = 0;
    int flag = 0;
    scanf("%d %d", &n, &m);
    w = (int*)malloc(sizeof(int) * n);//每个人的接水量
    p = (int*)malloc(sizeof(int) * m); //每个水龙头的当前待接水量

    for (i = 0; i < n; i++)
    {
        scanf("%d", &w[i]);
    }
    if (n <= m) //水龙头多
    {
        //找到最大水量即可
        time = w[0];
        for (i = 1; i < n; i++)
        {
            if (w[i] > time)
                time = w[i];
        }
        printf("%d", time);
    }
    else
    {
        for (i = 0; i < m; i++)
            p[i] = w[i];
        next = m;
        while (1)
        {
            //判断是否所有人都接完水
            flag = 0;
            for (i = 0; i < m; i++)
            {
                //printf("%d ", p[i]);
                if (p[i] != 0)
                {
                    flag = 1;
                    break;
                }
            }
            if (flag == 0)
            {
                printf("%d", time);
                return 0;
            }
            time++;
            for (i = 0; i < m; i++)
            {
                if (p[i] > 0)
                    p[i]--;
                if(p[i]==0 && next < n)
                {
                    p[i] = w[next];
                    next++;
                }
            }
            
        }
    }
    free(p); p = 0;
    free(w), w = 0;
    return 0;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632