[2010年NOIP普及组] 接水问题

[2010年NOIP普及组] 接水问题

思路:用贪心算法。分为两种情况,第一种是水龙头数多,一次就能都打完,直接输出用时最长的即可;第二种是人数多,需要一个接一个的接水,所以每次都要找出能先打完的水龙头,让后面的人接上,最后找出用时最长的水龙头。

(还要写两个函数,一个找数最大的,另一个找最小的)

代码如下:

#include <stdio.h>

int a[100+10];//水龙头数

int b[10000+10];//人数

int findmax(int *a,int b,int e){//找大的

    int i;

    int max=0;

    int k;

    for(i=b;i<=e;i++)

        if(max<a[i]){

            max=a[i];

            k=i;

        }

    return k;

}

int findmin(int *a,int b,int e){//找小的

    int i;

    int min=999999;

    int k;

    for(i=b;i<=e;i++)

        if(min>a[i]){

            min=a[i];

            k=i;

        }

    return k;

}

int main(){

    int i,j;

    int n,m;

    scanf("%d%d",&n,&m);

    for(i=1;i<=n;i++)

        scanf("%d",&b[i]);

    if(n<=m){//水龙头数多

        j=findmax(b,1,n);

        printf("%d\n",b[j]);

    }else{//人数多

        for(i=1;i<=m;i++)

            a[i]=b[i];//将水龙头的值赋上第一批同学打水的时间

        for(i=m+1;i<=n;i++){//加入后续打水学生

            j=findmin(a,1,m);//找每次最先打完水的水龙头

            a[j]+=b[i];//下一个接水的同学接上

        }

        j=findmax(a,1,m);//找出用时最长的水龙头序号

        printf("%d\n",a[j]);//输出时间

    }

    return 0;

}

posted @ 2022-08-16 20:26  shanyingrui  阅读(222)  评论(0编辑  收藏  举报