【二分枚举】修补木桶

转载 2016年08月29日 14:01:24

描述

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

已知一个木桶的桶壁由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


这题用到二分枚举+贪心的思想。搬一下taosama的代码来,仅作学习保存之用。原文链接:点击打开链接



//
//  Created by TaoSama on 2016-08-21
//  Copyright (c) 2016 TaoSama. All rights reserved.
//
#pragma comment(linker, "/STACK:102400000,102400000")
#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <string>
#include <set>
#include <vector>

using namespace std;
#define pr(x) cout << #x << " = " << x << "  "
#define prln(x) cout << #x << " = " << x << endl
const int N = 1e3 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;

int n, m, L;
int a[N];

bool check(int x) {
    vector<int> b(a, a + n);
    for(int t = 0; t < n; ++t) {
        int bk = b.back(); b.pop_back();
        b.insert(b.begin(), bk);

        int lft = m, ok = 1;
        for(int i = 0; i < n && ok;) {
            if(b[i] >= x) ++i;
            else {
                i += L;
                if(--lft < 0) ok = 0;
            }
        }
        if(ok) return true;
    }
    return false;
}

int main() {
#ifdef LOCAL
    freopen("C:\\Users\\TaoSama\\Desktop\\in.txt", "r", stdin);
//  freopen("C:\\Users\\TaoSama\\Desktop\\out.txt","w",stdout);
#endif
    ios_base::sync_with_stdio(0);

    scanf("%d%d%d", &n, &m, &L);
    for(int i = 0; i < n; ++i) scanf("%d", &a[i]);

    int l = 1, r = 1e9 + 10, ans = -1;
    while(l <= r) {
        int m = l + r >> 1;
        if(check(m)) ans = m, l = m + 1;
        else r = m - 1;
    }
    printf("%d\n", ans);

    return 0;
}



管理学定律五:二八定律与木桶理论

1、二八定律 1.1 来源 1897年,意大利经济学者帕累托偶然注意到19世纪英国人的财富和收益模式。在调查取样中,发现大部份的财富流向了少数人手里。同时,他还从早期的资料中发现,在其他的国家,都发现...
  • aoshilang2249
  • aoshilang2249
  • 2015年02月08日 09:51
  • 1636

Web 目录枚举与遍历漏洞解决

“目录枚举漏洞”解决方法一、名词解释 网站目录枚举漏洞:指黑客利用非法攻击手段扫描符合“8.3”命名原则的目录与文件。二、验证工具:scanner-compiled三、验证方法 图 1 四、...
  • hexieshangwang
  • hexieshangwang
  • 2015年11月19日 10:37
  • 5915

Java动态修改Enum实例

众所周知,enum类型实例数量是固定的,甚至还被用来设计单例。但有时候仍然存在需要动态增加Enum实例的场景,这也并非一定是设计失败,也可能是增加灵活性的实际需求,比如一些web框架,再比如HanLP...
  • huzhigenlaohu
  • huzhigenlaohu
  • 2016年05月28日 10:49
  • 3153

hihocoder #1362 : 修补木桶(二分)

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 一只木桶能盛多少水,并不取决于桶壁上最高的那块木板,而恰恰取决于桶壁上最短的那块。 已知...
  • u011699990
  • u011699990
  • 2016年08月26日 00:26
  • 304

hihocoder #1362 : 修补木桶(二分+dp)

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 一只木桶能盛多少水,并不取决于桶壁上最高的那块木板,而恰恰取决于桶壁上最短的那块。 已知...
  • hexianhao
  • hexianhao
  • 2016年09月01日 17:06
  • 327

11.01 早上 枚举+二分+并查集

立方数cubic 题目描述 题解 代码 立方数2cubicp 题目描述 题解 代码 T1T2题解 猜数字number 题目描述 题解 代码立方数(cubic)Time Limit:1000ms M...
  • loi_lxt
  • loi_lxt
  • 2017年11月01日 21:52
  • 85

hdu3118Arbiter (利用二分图的定义,枚举每种状态)

Arbiter Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Sub...
  • u010372095
  • u010372095
  • 2014年08月02日 00:41
  • 1332

HDU3118Arbiter (二分图的本质(好题)+二进制枚举)

题意:删除给出的图中的最少的边,让图无奇数边的环 二分图的定义:至少含有2个点,如果有环,环必须是偶数的边。 二分图如果分成两个部分,比如X,Y两部分,我们知道两部分之间是有边相连的,但是同一部分...
  • u013167299
  • u013167299
  • 2015年08月24日 16:21
  • 655

UVA-LA 3971 组装电脑 二分枚举

题目链接:UVA-LA 3971 题意:用不超过b的预算,购置电脑硬件,每种都需要购办一个,且要使品质最差的硬件的品质数最大。 题解:二分枚举,在每...
  • ADjky
  • ADjky
  • 2016年08月25日 15:04
  • 180

POJ 2182 Lost Cows (树状数组+二分 / 线段树 / 枚举)

给出n和每个数之前比它小的数有几个 需要输出原序列,最后一个数的真实值为a[N]+1 将a[N]+1在序列中删去,更新a[i],那么第N-1个数的真实值为a[N-1]+1。 做法很多,线段树...
  • CillyB
  • CillyB
  • 2017年03月14日 23:38
  • 145
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【二分枚举】修补木桶
举报原因:
原因补充:

(最多只允许输入30个字)