1362 : 修补木桶 -- 最长的最短边

描述

一只木桶能盛多少水,并不取决于桶壁上最高的那块木板,而恰恰取决于桶壁上最短的那块。

已知一个木桶的桶壁由N块木板组成,第i块木板的长度为Ai。

现在小Hi有一个快捷修补工具,每次可以使用修补工具将连续的不超过L块木板提高至任意高度。

已知修补工具一共可以使用M次(M*L<N),如何修补才能使最短的那块木板最高呢?

注意: 木板是环形排列的,第N-1块、第N块和第1块也被视为连续的。

输入

第1行:3个正整数,N, M, L。分别表示木板数量,修补工具使用次数,修补工具每次可以同时修补的木板数。 1≤N≤1,000,1≤L≤20,M*L<N

第2行:N个正整数,依次表示每一块木板的高度Ai,1≤Ai≤100,000,000

输出

第1行:1个整数。表示使用修补工具后,最短木块的所能达到的最高高度

样例说明

第一个修补工具覆盖[2 3 4]

第二个修补工具覆盖[5 8 1]

样例输入

8 2 3
8 1 9 2 3 4 7 5

样例输出

7

#include<iostream>
#include<vector>
using namespace std;
int n, m, l;
int A[1005];

bool check(int k)
{
for(int i = 0; i < n; i++)
{
int r = m;
bool flag = true;
for(int j = 0; j < n && flag; )
{
int t = (i+j) % n;
if(A[t] < k)
{
j += l;
if(--r < 0)
flag = false;
}
else
{
j++;
}
}
if(flag)
return true;
}
return false;
}

int main()
{
cin>>n>>m>>l;
for(int i = 0; i < n; i++)
cin>>A[i];
int left = 1, right = 100000000, k, ans = 0;
do
{
k = (left + right) >> 1;
if(check(k))
{
ans = k;
left = k + 1;
}
else
right = k - 1;
}while(left <= right);
cout<<ans<<endl;
return 0;
}

时间: 2024-12-28 21:07:12

1362 : 修补木桶 -- 最长的最短边的相关文章

计算机通信网中最长、最短的概念

MTU (Maximum Transmission Unit)——网络层 最大传输单元,最大报文包(以字节为单位). MSS ( Maximum Segment Size)——传输层 最大分段大小,是TCP协议里面的一个概念.为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以一般MSS值1460. 最小帧长——数据链路层 最小帧长的作用:这一

来自百度贴吧的练习题 :求最长单词的长度和最短单词的长度。

In the function ex5 write code that will input a line of text, split it into words, and display these words one per line, and also print the length of the longest and shortest words. You should regard any sequence of consecutive non-space characters

C语言之文件操作03——最长最短行查找和统计

//文件 /* =============================================================== 题目:从文本文件中找出最长和最短的行输出在屏幕上,并统计文件中 共有多少行? =============================================================== */ #include<stdio.h> #include<string.h> #define N 80 #define HH prin

最长最短单词

21:最长最短单词    总时间限制:1000ms  内存限制:65536kB描述    输入1行句子(不多于200个单词,每个单词长度不超过100),    只包含字母.空格和逗号.单词由至少一个连续的字母构成,    空格和逗号都是单词间的间隔.    试输出第1个最长的单词和第1个最短单词.输入    一行句子.输出    两行输出:    第1行,第一个最长的单词.    第2行,第一个最短的单词.样例输入    I am studying Programming language C

统计语句中的最长最短单词

已知 string sentence="We were her pride of 10 she named us: Benjamin, Phoenix, the Pordigal and perspicacious pacific Suzanne.";编写程序,计算sentence中有多少个单次,并指出其中最长和最短的单词,如果有多个,则将它们全部输出 使用find_first_of 和find_first_not_of,寻找到单词的起始位置: 使用vector存放最长和最短单词:通过

【华科考研机试题】最长&amp;最短文本

题目 输入多行字符串,请按照原文本中的顺序输出其中最短和最长的字符串,如果最短和最长的字符串不止一个,请全部输出. 解题思路 1.输入所有字符串(有空格不另算字符串). 2.将char*字符串转换成string型. 3.由于map是自动排好序的,所以begin和end可以取到最小的地址和最大的后一个地址. map <int,list<string>>m;//构造map m[s.length].push_back(s);//map插入 list l = m.begin()->s

木桶效应

盛水的木桶是由多块木板箍成的,盛水量也是由这些木板共同决定的. 若其中一块木板很短,则此木桶的盛水量就被限制,该短板就成了这个木桶盛水量的"限制因素". 1.一个水桶无论有多高,它盛水的高度取决于其中最低的那块木板: 一只水桶盛水的多少,并不取决于桶壁上最高的那块木块,而恰恰取决于桶壁上最短的那块. 根据这一核心内容,"水桶理论"还有两个推论: 其一,只有桶壁上的所有木板都足够高,那水桶才能盛满水. 其二,只要这个水桶里有一块不够高度,水桶里的水就不可能是满的. 形

【Android端 APP 启动时长获取】启动时长获取方案及具体实施

一.什么是启动时长? 1.启动时长一般包括三种场景,分别是:新装包的首次启动时长,冷启动时长.热启动时长 冷启动 和 热启动 : (1)冷启动:当启动应用时,后台没有该程序的进程,此时启动的话系统会分配一个新的进程给应用. (2)热启动:程序的进程依然存在,启动时通过已有进程启动进入到Activity显示页面的,就是热启动,或者从Android官网来看我们获取到的其实是温启动时长,就是Activity不存在的情况. (3)新装包的启动时长: 新装包的启动时长,预估是最长的,并且在5.0以下及5.

C++ Primer 课后习题9.39 统计单词个数并记录最大单词和最短单词

习题9.39: 已知有如下string对象: string line1 = "We were her pride of 10 she named us:"; string line2 = "Benjamin, Phoenix, the Prodigal"; string line3 = "and perspicacious perspicacious pacific Suzanne"; string sentence = line1 + ' '