zoukankan      html  css  js  c++  java
  • BZOJ 2196: [Usaco2011 Mar]Brownie Slicing( 二分答案 )

    二分答案就可以了....

    -----------------------------------------------------------------------

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<cctype>
     
    using namespace std;
     
    typedef long long ll;
     
    inline int read() {
    char c = getchar();
    int ret = 0;
    for(; !isdigit(c); c = getchar());
    for(; isdigit(c); c = getchar()) ret = ret * 10 + c - '0';
    return ret;
    }
     
    const int maxn = 509;
     
    int mat[maxn][maxn], sum[maxn][maxn], t[maxn], N, M, A, B;
     
    bool ok(int p, int c, int x) {
    if(sum[c][M] - sum[p][M] < x * B) return false;
    for(int i = 0; i <= M; i++)
    t[i] = sum[c][i] - sum[p][i];
    int _c = 1, _p = 0;
    for(int i = 0; i < B; i++) {
    while(t[_c] - t[_p] < x) 
    if(++_c > M) return false;
    _p = _c;
    }
    return true;
    }
     
    bool check(int x) {
    int p = 0, c = 1;
    for(int i = 0; i < A; i++) {
    while(!ok(p, c, x)) 
    if(++c > N) return false;
    p = c;
    }
    return true;
    }
     
    int main() {
    N = read(); M = read(); A = read(); B = read();
    for(int i = 1; i <= N; i++) {
    sum[i][0] = 0;
    for(int j = 1; j <= M; j++)
    sum[i][j] = sum[i][j - 1] + (mat[i][j] = read());
    }
    for(int j = 1; j <= M; j++) {
    sum[0][j] = 0;
    for(int i = 1; i <= N; i++)
    sum[i][j] += sum[i - 1][j];
    }
    int ans, L = 0, R = int(1e9);
    while(L <= R) {
    int m = (L + R) >> 1;
    if(check(m))
    ans = m, L = m + 1;
    else
    R = m - 1;
    }
    cout << ans << " ";
    return 0;
    }

    -----------------------------------------------------------------------

    2196: [Usaco2011 Mar]Brownie Slicing

    Time Limit: 10 Sec  Memory Limit: 259 MB
    Submit: 183  Solved: 123
    [Submit][Status][Discuss]

    Description

    Bessie烘焙了一块巧克力蛋糕。这块蛋糕是由R*C(1 <= R,C <= 500)个小的巧克力蛋糕组成的。 第i行,第j列的蛋糕有N_ij(1 <= N_ij <= 4,000)块巧克力碎屑。 Bessie想把蛋糕分成A*B块,(1 <= A <= R,1 <= B <= C): 给A*B只奶牛。蛋糕先水平地切A-1刀 (只能切沿整数坐标切)来把蛋糕划分成A块。然后再把剩下来的每一块独立地切B-1刀, 也只能切沿整数坐标切。其他A*B-1只奶牛就每人选一块,留下一块给Bessie。由于贪心, 他们只会留给Bessie巧克力碎屑最少的那块。 求出Bessie最优情况下会获得多少巧克力碎屑。 例如,考虑一个5*4的蛋糕,上面的碎屑分布如下图所示: 1 2 2 1 3 1 1 1 2 0 1 3 1 1 1 1 1 1 1 1 Bessie必须把蛋糕切成4条,每条分成2块。Bessie能像这样切蛋糕: 1 2 | 2 1 --------- 3 | 1 1 1 --------- 2 0 1 | 3 --------- 1 1 | 1 1 1 1 | 1 1 因此,其他贪得无厌的牛拿完后,Bessie仍能够拿走3个巧克力碎屑。

    Input

    * 第1行: 四个空格隔开的数: R, C, A ,B * 第2-R+1行: 第i+1行有C个整数, N_i1 , N_i2 .. N_iC

    Output

    * 第1行: 一个整数: Bessie保证能拿到的最多碎屑数

    Sample Input

    5 4 4 2
    1 2 2 1
    3 1 1 1
    2 0 1 3
    1 1 1 1
    1 1 1 1

    Sample Output

    3

    HINT

    Source

  • 相关阅读:
    JVM
    关于filter
    session
    xml
    互联网应用和企业级项目的区别
    本学期javaee目标
    团队项目软件度量
    团队项目总结
    团队项目来换网最新
    ubuntu18.04 编译opencv4.4.0 带cuda加速,ffmpeg
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4878947.html
Copyright © 2011-2022 走看看