zoukankan      html  css  js  c++  java
  • NOIP2010-普及组复赛-第二题-接水问题

    题目描述 Description
      学校里有一个水房,水房里一共装有 m 个龙头可供同学们打开水,每个龙头每秒钟的
    供水量相等,均为 1。 
      现在有 n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从 1到 n 编号,i 号同学的接水量为 wi。接水开始时,1 到 m 号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学 j 完成其接水量要求 wj后,下一名排队等候接水的同学 k马上接替 j 同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即j 同学第 x 秒结束时完成接水,则 k 同学第 x+1 秒立刻开始接水。若当前接水人数 n’不足 m,则只有 n’个龙头供水,其它 m−n’个龙头关闭。 
      现在给出 n 名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。
     输入输出格式 Input/output
    输入格式:
    输入文件名为 water.in。 
    第 1 行 2 个整数 n 和 m,用一个空格隔开,分别表示接水人数和龙头个数。 
    第 2 行 n 个整数 w1、w2、……、wn,每两个整数之间用一个空格隔开,wi表示 i 号同
    学的接水量。
    输出格式:
    输出文件名为 water.out。 
    输出只有一行,1 个整数,表示接水所需的总时间。
     输入输出样例 Sample input/output
    样例测试点#1
    输入样例:

    【输入样例1】
    5 3
    4 4 1 2 1
    【输入样例2】
    8 4
    23 71 87 32 70 93 80 76

    输出样例:

    【输出样例1】
    4
    【输出样例2】
    163

    说明 description
    【输入输出样例 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 秒。 
    【数据范围】 
    1≤n≤10000,1≤m≤100 且 m≤n; 
    1≤wi≤100。
     
    思路:这一题,看起来是有点麻烦,不过不难,纯模拟的,模拟一下接水过程
    分两种情况考虑:(1)接水人数n<=龙头个数,从大到小排序,输出最大那个
                          (2)接水人数n>龙头个数,先把因为顺序之前排好了,直接把第一批人数存入star数组,把剩下的人存入end数组
                                 循环n次
                                 {
                                     循环m次,每次-1(表示现在接水的人在这个时刻接了水) ,计数器time++,再判断,如果有人接完水了,end剩下数组里的人接替
                                 }
    代码如下:
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 int fun(const void *a,const void *b)//大到小快排 
     4 {
     5    return *(int*)b-*(int*)a;
     6 }
     7 int main()
     8 {
     9     int n,m,i,j;//n接水人数、m龙头个数
    10     int time=0,kk;//time次数 
    11     int w[10001];
    12     int star[10001],end[10001];
    13     //freopen("water.in","r",stdin);
    14     //freopen("water.out","w",stdout);
    15     scanf("%d%d",&n,&m);
    16     for(i=0;i<n;i++)//输入每个人要接水的数量,存入w数组 
    17     {
    18         scanf("%d",&w[i]);
    19     }
    20     if(n<=m)//接水人数小于龙头个数,从大到小排一下序,直接输出最大那个 
    21     {
    22         qsort(w,n,sizeof(int),fun);
    23         printf("%d
    ",w[0]);//输出最大 
    24     }
    25     else if(n>m)//接水人数大于于龙头个数,开始模拟 
    26     {
    27            for(i=0;i<m;i++)//存入在接水的人
    28         {
    29             star[i]=w[i];
    30         }
    31         for(j=i,kk=0;j<=n;j++,kk++)//存入剩下的人
    32         {
    33             end[kk]=w[j];
    34         }
    35         kk=i;//备份一下在接水的人数  
    36         j=0;
    37         while(n>0)//开始模拟接水 
    38         {
    39             for(i=0;i<kk;i++)//模拟接水过程,在接水的人所需的水量-1 
    40             {
    41                 star[i]--;
    42             }    
    43             time++;//次数+1                
    44               for(i=0;i<kk;i++)//如果一个人接完了,end数组里的剩下的人接替 
    45             {
    46                 if(star[i]==0)//接完了一个人 
    47                   {
    48                     star[i]+=end[j];//接替上一个人 
    49                       j++;//end剩下数组里的人下标j+1 
    50                       n--;//人数-1    
    51                   }                   
    52             }                                    
    53         }                
    54         printf("%d
    ",time);//输出次数 
    55     }
    56     return 0;
    57 }
  • 相关阅读:
    toj 2819 Travel
    toj 2807 Number Sort
    zoj 2818 Prairie dogs IV
    zoj 1276 Optimal Array Multiplication Sequence
    toj 2802 Tom's Game
    toj 2798 Farey Sequence
    toj 2815 Searching Problem
    toj 2806 Replace Words
    toj 2794 Bus
    css截取字符
  • 原文地址:https://www.cnblogs.com/geek-007/p/4746530.html
Copyright © 2011-2022 走看看