luoguP3017Brownie Slicing
https://www.luogu.org/problem/P3017
题意
给你一个蛋糕,R行C列 ,每个点有巧克力碎屑(如下)
1 2 2 1
3 1 1 1
2 0 1 3
1 1 1 1
1 1 1 1
你要先横着切a-1刀,将蛋糕分为a块,然后对于每一块,分别竖着切b-1刀
将整个蛋糕分成a*b块,求巧克力屑最少的一块最多有多少屑
R,C≤500 N_ij≤4,000
A ≤ R , B ≤ C
分析
依旧是最多的 最少值 是多少(有点绕口
依旧满足二分性
依旧可以合理的check
(请自主思考
我们这里注意的是怎么check(k)
思路:按照题目说的,先横着切一块,然后再切出的一块内竖着合理地切成b块,如果不能合法切成b块,就把第一刀横着的往下挪,直到能够切成b块,最后判断横着切的次数是否合法,得出k是否合法。
优化: 二维前缀和(很容易想到吧...不解释了
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAX 500+9
int R, C, a, b;
int arr, tmp[MAX*MAX], cnt;
int s[MAX][MAX]; //前缀和
int check(int k) {//最小的巧克力屑
int cuta = 0, now = 0;//目前切了几条 , 上一条在哪里
for(int i = 1; i <= R; i++) {
int cutb = 0, last = 0;//当前切了几块, 切的上一块在哪里
for(int j = 1; j <= C; j++)
if(s[i][j] - s[now][j] - s[i][last] + s[now][last] >= k) cutb++, last = j;//建议画图看看
if(cutb >= b) {
cuta++;
now = i;
}
}
return cuta >= a;
/*关于为什么这是>=: 我们这的if的意思是,只要当前块的和>=k,我们就切,
所以可能多切几刀,但这并不影响正确性: 你把后面多出来的几刀去掉,也只是使最后一块或最后一行额外的大,所以仍然合法 */
}
int main() {
scanf("%d%d%d%d",&R, &C, &a, &b);
for(int i = 1; i <= R; i++)
for(int j = 1; j <= C; j++) {
scanf("%d", &arr);
s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + arr;
}
int l = 1,r = s[R][C], mid;
int ans = 0;
while(l <= r) {//让ans最大
mid = (l+r)>>1;
if(check(mid)) {
ans = mid;
l = mid+1;
} else {
r = mid-1;
}
}
printf("%d",ans);
}
luoguP3017Brownie Slicing的更多相关文章
- 从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数
一.多态 多态性是面向对象程序设计的重要特征之一. 多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为. 多态的实现: 函数重载 运算符重载 模板 虚函数 (1).静态绑定与动态绑 ...
- BZOJ 2196: [Usaco2011 Mar]Brownie Slicing( 二分答案 )
二分答案就可以了.... ----------------------------------------------------------------------- #include<cst ...
- Numpy 笔记: 多维数组的切片(slicing)和索引(indexing)【转】
目录 切片(slicing)操作 索引(indexing) 操作 最简单的情况 获取多个元素 切片和索引的同异 切片(slicing)操作 Numpy 中多维数组的切片操作与 Python 中 lis ...
- Python学习--字符串slicing
Found this great table at http://wiki.python.org/moin/MovingToPythonFromOtherLanguages Python indexe ...
- ZOJ 3427 Array Slicing (scanf使用)
题意 Watashi发明了一种蛋疼(eggache) 语言 你要为这个语言实现一个 array slicing 函数 这个函数的功能是 有一个数组初始为空 每次给你一个区间[ l, r) 和 ...
- Object Slicing in C++
In C++, a derived class object can be assigned to base class, but the other way is not possible. cla ...
- [Python Cookbook] Numpy Array Slicing and Indexing
1-D Array Indexing Use bracket notation [ ] to get the value at a specific index. Remember that inde ...
- [Python] Slicing Lists
In addition to accessing individual elements from a list we can use Python's slicing notation to acc ...
- 《流畅的Python》 Sequence Hacking, Hashing and Slicing(没完成)
序列修改,散列和切片 基本序列协议:Basic sequence protocol: __len__ and __getitem__ 本章通过代码讨论一个概念: 把protocol当成一个正式接口.协 ...
随机推荐
- Scrapy_redis
简介 scrapy_redis是一个基于Redis的Scrapy组件,用于scrapy项目的分布式部署和开发 你可以启动多个spider对象,互相之间共享有一个redis的request队列,最适合多 ...
- Octave移动数据
A=[1 2;3 4;5 6] size(A) 会返回(3,2) length(A) 会返回矩阵的维度 =3 pwd :查看当前Octave的路径 cd D:/... :改变Octave的 ...
- misc-适合作为桌面
今年黑盾杯的misc之一,居然是两年前的世安杯原题 神器stegsolve获得二维码 用QR-Research获得一段十六进制 用winhex填充数据 ascll->hex(之前只做到这里,看 ...
- AcWing 799. 最长连续不重复子序列
网址 https://www.acwing.com/solution/AcWing/content/2069/ 题目描述给定一个长度为n的整数序列,请找出最长的不包含重复数字的连续子序列,输出它的长 ...
- SP1716 GSS3 - Can you answer these queries III 线段树
问题描述 [LG-SP1716](https://www.luogu.org/problem/SP1716] 题解 GSS 系列的第三题,在第一题的基础上带单点修改. 第一题题解传送门 在第一题的基础 ...
- os 和 sys 的模块使用方法和模块
os 的模块 方法 os.remove()删除文件 os.rename()重命名文件 os.walk()生成目录树下的所有文件名 os.chdir()改变目录 os.mkdir/maked ...
- WPF 精修篇 样式继承
原文:WPF 精修篇 样式继承 这个 是新知识 样式可以继承 <Style x:Key="TextBlockStyleBase" TargetType="{x:Ty ...
- Vue 监听鼠标左键 鼠标右键以及鼠标中键修饰符click.left&contextmenu&click.middle
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- navicat连接mysql报错1251解决方案,从头搭建node + mysql 8.0 (本人亲测有效)
准备学node 好久了 一直没有动手去写,今天突发奇想,然后就安装了一个mysql (找了一个博客跟着步骤去安装的),然后打算用node 写个增删改查. 1.下载mysql安装包 地址: http ...
- Python extend函数解读
num = [1,2] print('将1迭代2次') num.extend([1]*2) print(num) print('将2迭代3次') num.extend([2] * 3) print(n ...