接水问题(这题可能有点水)
来源:互联网 发布:奇葩室友 知乎 编辑:程序博客网 时间:2024/06/10 07:21
算法训练 接水问题
时间限制:1.0s 内存限制:64.0MB
问题描述
学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的 供水量相等,均为1。 现在有n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1 到n 编号,i 号同学的接水量为wi。接水开始时,1 到m 号同学各占一个水龙头,并同时打 开水龙头接水。当其中某名同学j 完成其接水量要求wj 后,下一名排队等候接水的同学k 马上接替j 同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即 j 同学第x 秒结束时完成接水,则k 同学第x+1 秒立刻开始接水。若当前接水人数n’不足m, 则只有n’个龙头供水,其它m−n’个龙头关闭。 现在给出n 名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。
输入格式
第1 行2 个整数n 和m,用一个空格隔开,分别表示接水人数和龙头个数。 第2 行n 个整数w1、w2、……、wn,每两个整数之间用一个空格隔开,wi 表示i 号同 学的接水量。
输出格式
输出只有一行,1 个整数,表示接水所需的总时间。
样例输入
5 3
4 4 1 2 1
4 4 1 2 1
样例输出
4
样例输入
8 4
23 71 87 32 70 93 80 76
23 71 87 32 70 93 80 76
样例输出
163
输入输出样例 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 秒。
水,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 ≤ wi ≤ 100。
本题为模拟题, 但是真心不难。。。
第一个代码(90分):注释部分百思不得其解,为什么去掉才是对的。。。若有告知,不胜感激
# include <stdio.h># include <algorithm>using namespace std;int c[11111];int cmp(int a, int b){ return a<b;}int max(int to){ int i; int m=-65536; for (i=1; i<=to; i++) if (c[i] > m) m = c[i]; return m;}int main(){ int sec=0; int n,m; int i; scanf("%d %d", &n, &m); int k=m; for (i=1; i<=n; i++) scanf("%d", &c[i]); if (n > m) { while (c[m] > 0) { sort(c+1, c+1+m, cmp); while (c[1]) { for (i=1; i<=m; i++) c[i] = c[i]-1; sec++; } if (c[m] <= 0)/* 就这个if 了,,真心不懂 */////////// {////////////// printf("%d", sec); ///////////////////////////// break; //////////////////////////////// } ///////////////////////////////////////////////////// c[1] = c[k+1]; if (k+1 == n) { sec += max(m); printf("%d", sec); return 0; } k++; } } else printf("%d", max(n)); return 0;}下面是正确代码(即去掉上面有注释的部分):
# include <stdio.h># include <algorithm>using namespace std;int c[11111];int cmp(int a, int b){ return a<b;}int max(int to){ int i; int m=-65536; for (i=1; i<=to; i++) if (c[i] > m) m = c[i]; return m;}int main(){ int sec=0; int n,m; int i; scanf("%d %d", &n, &m); int k=m; for (i=1; i<=n; i++) scanf("%d", &c[i]); if (n > m) { while (c[m] > 0) { sort(c+1, c+1+m, cmp); while (c[1]) { for (i=1; i<=m; i++) c[i] = c[i]-1; sec++; } c[1] = c[k+1]; if (k+1 == n) { sec += max(m); printf("%d", sec); return 0; } k++; } } else printf("%d", max(n)); return 0;}
我的解题思想是:
如果n<=m, 那么多个水龙头同时供水,也就是直接输出最水的那个人要打的水所花费的时间。
那如果n>m, 就有人要等待了赛,就把前m 个人要接的水排序嘛,由小到大,那第一个人打完了水,接着就取第m+1个人的,替换到c[1]上来。再排序,c[1]完了再替换,依次下去,,,直到c[m]为0,就结束了。
这里有一个小优化,就是如果已经没有人等了,那我们就直接输出最水的(不用再计算了)对吧?
0 0
- 接水问题(这题可能有点水)
- 现在的小学生和中学生体育锻炼可能有点问题
- 可能又有点茫然了
- 有点问题
- 有点问题
- 学生信息查询系统(有点问题)
- 左旋字符串问题(有点料)
- 解方程(有点精度问题)
- PAT A1010 Radix (有点问题)
- Java基础,这是自己看视频总结的,可能有点乱
- VC++ 中操作EXCEL总结(转)(以后可能有点用)
- 为宝宝检查作业的小东东(可能有点小题大做,请拍砖的手下留情)
- ubuntu下nginx的安装教程(过程可能有点不同)
- 可能感冒了,头有点晕
- spd read 当时编的.可能有点问题的..那个AMD的 SMBus 地址貌似可以固定下来.
- [U]3.2.1 Factorials 有点点意思的水题
- 2013 吉林通化邀请赛 Tutor 有点坑的水题
- Sereja and Bottles-水题有点坑爹
- 简明 Vim 练级攻略
- 解决python代理的问题
- 网狐6603很抱歉,游戏房间连接失败,请稍候再试或留意网站公告!
- IIS数据库连接出错的一些解决办法
- 关于网狐6603ewin版抽水问题
- 接水问题(这题可能有点水)
- maven常见问题问答
- 假如,青春是高效率的
- 四组件之Service
- const使用
- android中的提示类组件toast,dialog,notification,widget
- 星际交流(回溯)
- 摆动序列(DP)
- 网狐6603网站后台增加游戏只能写入11个字符不能正确填写