首页 新闻 会员 周边 捐助

谁能提供一下 open上的1.9 的最后一题 接水问题 的思路 真的不会 网上说要用模拟方法 可是我们还没学 所以有大佬可以提供一下思路吗

0
悬赏园豆:10 [已解决问题] 解决于 2018-12-16 10:58

http://noi.openjudge.cn/ch0109/15/

打着玩的主页 打着玩 | 初学一级 | 园豆:132
提问于:2018-12-08 13:49
< >
分享
最佳答案
0

//问题转化为:所有人接完水后,每个水龙头的出水量,,最大量,即为所有同学都接完水需要多少秒
//m: 水龙头个数
//weight: 每个学生接的水量
function calc(m,weight){
var water = new Array(m);
//初始化: water[i] 表示第 i个水龙头,需求放水的总量

    var n = weight.length; //学生的人数
    var max = weight[0];
    if(n <= m){
        //如果学生人数小于等于水龙头数量,则只需找 weight里面最大值
        for(var i = 1; i < n; i++){
            if(max < weight[i]){
                max = weight[i];
            }
        }
        return max;
    }
    
    
    //初始化数据
    for( i = 0; i < m; i++){
        water[i] = weight[i];
    }

    var currIndex = i; //当前应该加入的第i位同学
    var minIndex = 0   //最小值的位置
    while(currIndex < n){
        for( i = 0; i < m; i++){
            if(water[minIndex] > water[i]){
                minIndex = i;
            }
        }
        
        water[minIndex] = water[minIndex] + weight[currIndex]; //将需要接入的同学,加入到后面
        currIndex++;
    }       
    
    //找到最大值 
    max = water[0];
    for( i = 0; i < m; i++){
        if(max < water[i]){
            max = water[i]
        }
    }
    
    return max;
    
    
}

var res = calc(4,[23, 71, 87 ,32 ,70 ,93 ,80, 76]);
console.log(res)
收获园豆:10
muamaker | 小虾三级 |园豆:763 | 2018-12-14 14:27
其他回答(2)
0

模拟方法,其实不用学,因为它根本不属于算法。

模拟题,顾名思义你用代码模拟题目的过程就可以。这道题目,你就用代码模拟接水的过程。具体怎么模拟呢?这就要靠你自己 的逻辑思维,这类题目一般没有难度但是比较繁琐。是肯定可以做出来,就是时间长容易出错而已。

接水的同学,你可以用队列来模拟。而水龙头每秒钟出水你可以用while循环来模拟,所有水龙头接水结束那就是break循环。

Shendu.CC | 园豆:2138 (老鸟四级) | 2018-12-12 13:42
0
#include <stdio.h>
#include <string.h>
int main()
 {
  int n, m;
  scanf("%d %d", &n, &m);
  int i, j, k = 0, l = 0, t = 0, a[10010] = {-1}, b[100];
  for (i = 0; i < n; i++) {
    scanf("%d", &a[i]);
    if (a[i] == 0) {
      i = i - 1;
      n = n - 1;
    }
  }
  while (1) {
    for (i = 0; i < m; i++)
     {
      a[i] = a[i] - 1;
      if (a[i] == 0)
       {
        a[i] = a[m + l];
        l++;
        n--;
      }
     }
     if (n <= m)
    {
      for(i=0;i<m;i++)
        {
       k=k>a[i]?k:a[i];
        }
        t=t+k+1;
    }
     if (n <= m)
     {
      break;
     }
    t++;
  }

  printf("%d", t);

}

自己解决了 

打着玩 | 园豆:132 (初学一级) | 2018-12-16 10:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册