zoukankan      html  css  js  c++  java
  • 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);
    }
    
  • 相关阅读:
    设置GridView、DataGrid 以提供thead、tbody等标签
    SqlCommandBuilder 可批量新增与修改数据
    js中的截流
    react代码分离方案
    redux在react中的使用
    react 生命周期
    react 函数bind(this)的三种方式
    react 三种组件定义方式
    linux系统下nginx安装目录和nginx.conf配置文件目录
    react component lifecycle
  • 原文地址:https://www.cnblogs.com/tyner/p/11267885.html
Copyright © 2011-2022 走看看