描述

Given an N x N square grid (2 <= N <= 15) and each grid has some beans in it. You want to write at most K (1 <= K <= 2N - 2) horizontal or vertical lines going across the entire grid, which to partition the grid into some piles.

But you want to minimize the number of the largest resulting piles of beans. Given the number of beans in each square, please compute the
number of the largest pile of beans.

输入

The first line has two integers, N and K and then follows N lines, each line has N non-negative integers, indicating the number of beans no more than 1000.

输出

Output the minimum possible number of the largest pile of beans.

样例输入

3 2

1 1 2

1 1 2

2 2 4

样例输出

4

提示

write vertical line between columns 2 and 3, and another horizontal line between rows 2 and 3, which creates 4 piles, each with 4 beans.

题意:

给一个n*n的矩阵,横着或竖着切最多k次,最小化切完后所有块数值和的最大值。

题目分析:

可以枚举横着切的情况,然后二分答案,用贪心判可不可行。

#include <bits/stdc++.h>
using namespace std;
const int N=;
int a[N][N],t[N],s[N],cnt;
int n,k,sum;
bool check(int x) {
for(int i=;i<cnt;i++) s[i]=;
int ans=;
for(int i=;i<=n;i++) {
bool f=true;
for(int j=;j<cnt;j++) {
s[j]+=a[t[j]][i]-a[t[j-]][i];
if(s[j]>x) f=false;
}
if(f) continue;
ans++;
for(int j=;j<cnt;j++) {
s[j]=a[t[j]][i]-a[t[j-]][i];
if(s[j]>x) return false;
}
}
return ans+cnt-<=k;
}
int main() {
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++) {
for(int j=;j<=n;j++) {
scanf("%d",&a[i][j]);
sum+=a[i][j];
a[i][j]+=a[i-][j];
}
}
int S=<<(n-),ans=1e9;
for(int s=;s<S;s++) {//枚举横切情况
cnt=;
t[cnt++]=;
for(int i=;i<n-;i++) {
if((<<i)&s) t[cnt++]=i+;
}
t[cnt++]=n;
if(cnt->k) continue;
int L=,R=sum,x;
while(L<=R) {
int mid=(L+R)>>;
if(check(mid)) x=mid,R=mid-;
else L=mid+;
}
ans=min(ans,x);
}
printf("%d\n",ans);
return ;
}

TZOJ 4359: Partition the beans (二分)的更多相关文章

  1. Codeforces Round #768 (Div. 2) D. Range and Partition // 思维 + 贪心 + 二分查找

    The link to problem:Problem - D - Codeforces   D. Range and Partition  time limit per test: 2 second ...

  2. TZOJ 4471: Postman FJ (二分+bfs)

    描述 FJ now is a postman of a small town in the hills. The town can be represented by a N×N matrix. Ea ...

  3. 二分partition算法应用

    一个二分partition算法,将整个数组分解为小于某个数和大于某个数的两个部分,然后递归进行排序算法. 法一: int partition(vector<int>&arr, in ...

  4. HDU 5646 DZY Loves Partition 数学 二分

    DZY Loves Partition 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5646 Description DZY loves parti ...

  5. zoj-3963 Heap Partition(贪心+二分+树状数组)

    题目链接: Heap Partition Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge A sequence ...

  6. zoj 3963 Heap Partition(并查集,贪心,二分)

    Heap Partition Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge A sequence S = { ...

  7. Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3) E. Prairie Partition 二分+贪心

    E. Prairie Partition It can be shown that any positive integer x can be uniquely represented as x =  ...

  8. 二分查找时间复杂度、partition时间复杂度

    二分查找时间复杂度 partition时间复杂度 O(n) = O(n) + O(n/2) + O(n/4)+.... 然后用等比求和公式得出是O(2n),即O(n)

  9. UVALive 2238 Fixed Partition Memory Management(二分完美匹配)

    题意:计算机中有一些固定大小的内存,内存越大,处理速度越快.对于一个程序,加入不同的内存空间,处理所需时间不同.现给出m个内存空间,n个程序,对于每个程序程序,有k组数据(s,t),分别表示当程序 i ...

随机推荐

  1. SpringBooot- 访问时,默认有弹出认证

    SpringBooot- 访问时,默认有弹出认证 springboot启动成功后,访问请求时,默认弹出窗口,需登录认证. 原因: 是由于使用了springsecurity的默认安全策略,解决方案:启动 ...

  2. js判断两个对象是否相等

    function isObjectValueEqual(a, b) { if(typeof a == 'number' && typeof b == 'number'){ return ...

  3. 第03章 科学计算库Numpy

    016.Numpy数据结构    关于矩阵运算的库 矩阵 017.Numpy基本操作 判断每一个元素的 018.Numpy矩阵属性 019.Numpy矩阵操作 020.Numpy常用函数 按列拼接就用 ...

  4. 使用代码创建rabbitmq交换机和队列绑定

    1.获取channel对象 2.声明(创建)对列 // 第一个参数,queueName:对列名称.数据类型:String// 第二个参数,durable:是否持久化, 队列的声明默认是存放到内存中的, ...

  5. bzoj 1034 [ZJOI2008]泡泡堂BNB——贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1034 原来觉得和 bzoj4977跳伞求生 有点像(虽然还没做). 所以对于a[ ]从小到大 ...

  6. LA4254 Processor

      题意:有n个任务,每个任务有三个参数ri,di和wi,表示必须在时刻[ri,di]之内执行,工作量为wi.处理器执行速度可以变化,当执行速度为s时,工作量为wi.处理器的速度可以变化,当执行速度为 ...

  7. 从Java到C++——union的使用方法

    版权声明:本文为博主原创文章,未经博主同意不得用于不论什么商业用途,转载请注明出处. https://blog.csdn.net/luoweifu/article/details/33342965 你 ...

  8. Struts_添加客户练习

    1.修改CustomerAction,实现ModelDriven接口 2.修改配置文件 3.修改表单提交地址

  9. 集训队日常训练20180513-DIV1

    A.3132 给一个有向图,问能否从任意点出发都能进入一个环中. 深搜. #include<bits/stdc++.h> using namespace std; ; vector< ...

  10. 洛谷P1147 连续自然数和 [2017年6月计划 数论01]

    P1147 连续自然数和 题目描述 对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M. 例子:1998+1999+2000+2001+2002 = 10000,所以 ...