接水问题(贪心课后题顺序查找是什么鬼)

15:接水问题

总时间限制: 
1000ms

内存限制: 
65536kB
描述

学校里有一个水房,水房里一共装有 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 ≤ n ≤ 10000,1 ≤ m ≤ 100 且 m ≤ n;
1 ≤ wi ≤ 100。

输出
输出只有一行,1 个整数,表示接水所需的总时间。
样例输入
样例 #1:
5 3
4 4 1 2 1

样例 #2:
8 4
23 71 87 32 70 93 80 76
样例输出
样例 #1:
4

样例 #2:
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 秒。
来源
NOIP2010复赛 普及组 第二题
【神的分析】感觉我思路有点奇葩,可是就是这么推出来的呀,,只是代码实现了而已。
【代码妹子】

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<algorithm>
 5 using namespace std;
 6 int Time[10009];
 7 int n,m,maxx=0;
 8 int main()
 9 {
10     scanf("%d%d",&n,&m);
11     for(int i=1;i<=n;i++)
12     {
13         scanf("%d",&Time[i]);
14         maxx=max(maxx,Time[i]);//接水时间最长的找出来
15     }
16     if(m>=n)
17     {
18         printf("%d",maxx);//如果水龙头够分的话时间就是最长时间,输出最长时间结束程序就好了
19         return 0;
20     }
21     int l=1,r=m,tot=0;//如果水龙头不够就挨个轮呗
22     for(int j=l;j<=n-m+1;j++)//m个水龙头从左向右移动,也就是长为m的区间平移
23     {
24         sort(Time+l,Time+r+1);//排序后的第一个就是花费最短时间的
25         if(r==n)//建议先看完下面的for循环再看这个if语句
26         {
27             tot+=Time[r];//当右移到头时,最后m个人一定是花费时间一定是m个人中的最长时间
28             printf("%d",tot);//所以tot要加入排序后的最后一个
29             return 0;//结束
30         }
31         for(int i=l+1;i<=r;i++)//注意这里一定要从l+1开始循环,因为要减去Time[l],不能让它的值先改变改变
32         {
33             Time[i]-=Time[l];//每个人的时间减去Time[l],也就是减去这m个水龙头中最少的时间
34         }
35         tot+=Time[l];//总时间加上这个刚走的人的时间(刚走的人就是排序后最小的呀)
36         l++;r++;//区间向右移动,继续下一个人;
37     }
38     return 0;
39 }

时间: 2025-01-17 22:43:33

接水问题(贪心课后题顺序查找是什么鬼)的相关文章

《数据结构、算法与应用》8.(顺序查找数组中第一个出现指定元素的位置)

最近在读<数据结构.算法与应用>这本书,把书上的习题总结一下,用自己的方法来实现了这些题,可能在效率,编码等方面存在着很多的问题,也可能是错误的实现,如果大家在看这本书的时候有更优更好的方法来实现,还请大家多多留言交流多多指正,谢谢 8. 从左至右检查数组a[0:n-1]中的元素,以查找雨x相等的那些元素.如果找到一个元素与x相等,则函数返回x第一次出现所在的位置.如果在数组中没有找到这样的元素,函数则返回-1. // // main.cpp // Test_08 // // Created

C++ Primer 第五版 部分课后题答案

当时刚学C++的时候买了这本书,一开始前面看的一知半解,索性就先缓缓,等学完学校的C++课程(中途自己也写了不少c++的代码),一段时间之后又拿起这本书去看,感觉还是挺有滋味的,这本书对我印象中的C++做了很大的扩展,个人认为这本书不太适合刚学C++就去看,而是写了一定的代码,对C++有一个大体的了解之后再去看会很有味道.在看书的过程中自己也写了上面的课后练习题,现在整理一下,也跟大家分享一下,下面是9~12 15~16章的课后题编程题的答案 (第八章之前的都没保存/(ㄒoㄒ)/~~): 当时保

[Python]小甲鱼Python视频第030课(文件系统:介绍一个高大上的东西)课后题及参考解答

# -*- coding: utf-8 -*- """ Created on Fri Mar 8 15:49:32 2019 @author: Administrator """ """ 动动手: 0. 编写一个程序,统计当前目录下每个文件类型的文件数,程序实现如图: 1. 编写一个程序,计算当前文件夹下所有文件的大小,程序实现如图 2. 编写一个程序,用户输入文件名以及开始搜索的路径,搜索该文件是否存在.如遇到文件

查找之一顺序查找

一. 1 public class Sequential_SearchDemo01 { 2 static int[] num = {1,3,4,6}; 3 public static void main(String[] args) { 4 int key = 7; 5 boolean x = Sequential_Search(key); 6 System.out.println(x); 7 } 8 private static boolean Sequential_Search(int ke

算法-符号表的实现(顺序查找和二分查找)

符号表是一种存储键值对的数据结构,支持两种操作插入和查找,就是将一组新的键值对存入表中然后根据给定的键得到对应的值,在编程语言中常用Dictionary原理类似.符号表是一种典型的抽象数据结构,在生活之中应用的场景也很多,可以根据钥匙开门,域名解析的时候的IP地址查询,字典和图书的简介和页数,key和value是密不可分的,通过key我们可以很快找到我们需要的value. 无序链表的顺序查找 主要通过Node节点存储数据,之前的博客中有关于链表的实现,详情可参考之前的博客,代码有注释就解释太多了

顺序查找

顺序查找属于查找中较容易的一个方法,且对数据是否已经排序没有要求,是很常用的一个查找算法. 但缺点是必须一个一个数字进行比较查找,查找所需步骤可能较多. 顺序查找算法的思想是,将目标与待查找数据进行比较,若发现与目标数据相同的数据,则查找停止, 返回此时被找到的数据的位置. // 算法设计 顺序查找 # include <stdio.h> int FindBySeq(int *ListSeq, int ListLength, int KeyData) // ListLength 表示数组长度

算法——蛮力法之顺序查找和蛮力字符串匹配

接着昨天的选择排序和冒泡排序之后,今天来实现一下顺序查找和蛮力字符串匹配两个算法. 顺序查找就是将给定的查找键和列表周玲的每个元素进行比较,直到找到一个匹配成功的元素返回该元素下标,查找成功,或者查找整个列表二没有匹配元素,查找失败.这里记录一下限位器版顺序查找方法.限位器就是指将查找键添加到列表最后,这样在查找的过程中,不用再每次都判断是否到达列表尾部来判断查找是否失败,而是在查找结束后,判断匹配元素下标是否小于n(假设列表有n个元素)来判断查找是否成功.下面是限位器版顺序查找算法: 限位器版

顺序查找和二分查找

1.使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组[转] 2.顺序查找 <?php//$n为待查找的数组元素的个数,$k为待查找的元素function seq_sch($array, $n, $k){ $array[$n] = $k; for($i=0; $i<$n; $i++){ if($array[$i]==$k){ return true;break; } } if ($i<$n) //判断是否到数组的末尾{ return $i

查找算法(I) 顺序查找 二分查找 索引查找

查找 本文为查找算法的第一部分内容,包括了基本概念,顺序查找.二分查找和索引查找.关于散列表和B树查找的内容,待有空更新吧. 基本概念 查找(search)又称检索,在计算机上对数据表进行查找,就是根据所给条件查找出满足条件的第一条记录(元素)或全部记录. 若没有找到满足条件的记录,则返回特定值,表明查找失败:若查找到满足条件的 第一条记录,则表明查找成功,通常要求返回该记录的存储位置或记录值本身,以便进行进一步处理:若需要查找到满足条件的所有记录,则可看做在多个区间内连 续查找到满足条件的第一