http://noi.openjudge.cn/ch0109/15/
//问题转化为:所有人接完水后,每个水龙头的出水量,,最大量,即为所有同学都接完水需要多少秒
//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)
模拟方法,其实不用学,因为它根本不属于算法。
模拟题,顾名思义你用代码模拟题目的过程就可以。这道题目,你就用代码模拟接水的过程。具体怎么模拟呢?这就要靠你自己 的逻辑思维,这类题目一般没有难度但是比较繁琐。是肯定可以做出来,就是时间长容易出错而已。
接水的同学,你可以用队列来模拟。而水龙头每秒钟出水你可以用while循环来模拟,所有水龙头接水结束那就是break循环。
#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); }
自己解决了