百度之星题解(蛋糕划分)

简介: 百度之星题解(蛋糕划分)

小度准备切一个蛋糕。这个蛋糕的大小为 N∗N,蛋糕每个部分的重量并不均匀。

小度一共可以切K 刀,每一刀都是垂直或者水平的,现在小度想知道在切了 K 刀之后,最重的一块蛋糕最轻的重量是多少。


格式

输入格式:

第1行包含N和K。其中:2≤

输入格式:

第1行包含N和K。其中:2≤N≤15,1≤K≤2N−2;

第2到第1+N行:每行 N 个数字,描述这一行蛋糕每个位置的重量 W。其中:0≤W≤1000。

≤15;

输出格式:

输出一个整数,最重的一块蛋糕最轻是多少。

样例 1

输入:

3 2

1 1 2

1 1 2

2 2 5

输出:

5

#include<bits/stdc++.h> 
using namespace std;
int n,k,fal,max_;
int a[20][20],sum[20][20],col[20],cnt[20],temp[20];
int get_sum(int x1,int y1,int x2,int y2){
    return sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1];
}
bool check(int m){
    if(m<max_) return false;
    for(int i=0;i<(1<<(n-1));i++){
        fal=0;
        memset(col,0,sizeof(col));
        memset(cnt,0,sizeof(cnt));
        memset(temp,0,sizeof(temp));
        vector<int> v;
        int count=0,ans=0,tmp=i;
        while(tmp){
            count++;
            if(tmp&1){
                v.push_back(count);
                ans++;
            }
            tmp/=2;
        }
        if(ans>k) continue;
        v.push_back(n);
        int p=0,top=1,down;
        for(int j=1;j<=n;j++){
            p=0,top=1;
            for(int x:v){
                down=x;
                int now=get_sum(top,j,down,j);
                if(now>m){
                    fal=1;break;
                }
                cnt[++p]+=now;
                if(col[j-1]){
                    cnt[p]=now;
                }
                temp[p]=now;
                if(cnt[p]>m){
                    col[j-1]=1;
                    cnt[p]=now;
                    for(int ii=1;ii<p;ii++) cnt[ii]=temp[ii];
                }
                top=down+1;
            }if(fal) continue;
            for(int j=1;j<=n-1;j++){
                if(ans<=k) return true;
            }
            return false;
        }
    }
}
int main( )
{ 
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j];
            max_=max(max_,a[i][j]);
            sum[i][j]=a[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
        }
    }
    int l=0,r=2000*15*15;
    while(l<=r){
        int m=(l+r)>>1;
        if(check(m)) r=m-1;
        else l=m+1;
    }cout<<l<<'\n';
    return 0;
}
相关文章
|
存储 C语言 Python
每日一练--(陶陶摘苹果)(n边形划分)
每日一练--(陶陶摘苹果)(n边形划分)
|
测试技术
第十届蓝桥杯题解 ---渣渣分析
第十届蓝桥杯题解 ---渣渣分析
|
存储 算法
【蓝桥杯集训·每日一题】AcWing 3728. 城市通电
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 Prim算法
94 0
|
存储 算法
【蓝桥杯集训·每日一题】AcWing 1562. 微博转发
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 宽搜BFS
72 0
|
存储 机器学习/深度学习 人工智能
【蓝桥杯集训·周赛】AcWing 第94场周赛
文章目录 第一题 AcWing 4870. 装物品 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4871. 最早时刻 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4872. 最短路之和 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
79 0
|
存储 机器学习/深度学习 人工智能
【蓝桥杯集训·周赛】AcWing 第 95 场周赛
文章目录 第一题 AcWing 4873. 简单计算 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4874. 约数 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4875. 整数游戏 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
116 0
|
存储 人工智能 算法
【蓝桥杯集训·最后一次周赛】AcWing 第 97 场周赛
文章目录 第一题 AcWing 4944. 热身计算 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4945. 比大小 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4946. 叶子节点 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
134 0
|
JavaScript BI
【蓝桥杯集训·周赛】AcWing 第96场周赛
文章目录 第一题 AcWing 4876. 完美数 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4877. 最大价值 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4878. 维护数组 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
92 0
|
存储
【蓝桥杯集训·每日一题】AcWing 4309. 消灭老鼠
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 最大公约数
91 0
|
存储 人工智能 BI
【蓝桥杯集训·周赛】AcWing 第91场周赛
文章目录 第一题 AcWing 4861. 构造数列 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4862. 浇花 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4861. 构造数列 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
87 0

热门文章

最新文章