【NOIP2014模拟11.3】蛋糕
题目
今天是Bessie的生日,他买了一个蛋糕和朋友们一起分享,蛋糕可以看成是一个R行C列的表格,共有R*C个格子,每个格子都有一个0至9的数字,表示该格子蛋糕拥有的巧克力。现在Bessie要把蛋糕横的切3刀再竖的切3刀,由于Bessie刀法厉害,所以每个格子蛋糕都是完整的,显然蛋糕会被切成16份,然后Bessie和他的15个朋友们每人拿一份,Bessie比较客气,总是等其他朋友拿完了,Bessie拿最后剩下的那一份。Bessie的朋友们都很不客气,都是挑最多巧克力的那份去拿,于是Bessie最后拿到手的那份蛋糕总是巧克力总和最少的。Bessie心想:既然自己总是最后拿蛋糕,那应该怎么切蛋糕,才能使得自己拿的那部分蛋糕的有尽量多的巧克力呢?这个问题自然是你的任务了。
分析
要求最大值最小,自然考虑到二分答案,
那么暴力枚举横切的三条边,
将竖切的三条边用三次二分来找出来,如果无法找出这缩小二分出的答案。
时间复杂度\(O(log_2(\dfrac{sum}{16})n^33log_2n)\)
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
const int mo=1000000007;
const int N=85;
using namespace std;
int a[N][N],n,m,sum[N][N],d[4];
int val(int x,int y,int x1,int y1)
{
	return sum[x1][y1]-sum[x-1][y1]-sum[x1][y-1]+sum[x-1][y-1];
}
int rf(int l,int r,int v)
{
	int t=l;
	while(l<r)
	{
		int mid=(l+r)/2;
		if(v<=min(val(1,t,d[1],mid),min(val(d[1]+1,t,d[2],mid),min(val(d[2]+1,t,d[3],mid),val(d[3]+1,t,n,mid))))) r=mid;
		else
			l=mid+1;
	}
	return l;
}
bool ok(int v)
{
	int pos=1,np=0;
	np=rf(pos,m+1,v);
	if(np==m+1) return false;
	pos=np+1;
	np=rf(pos,m+1,v);
	if(np==m+1) return false;
	pos=np+1;
	np=rf(pos,m+1,v);
	if(np==m+1) return false;
	pos=np+1;
	np=rf(pos,m+1,v);
	if(np==m+1) return false;
	return true;
}
bool dg(int x,int j,int v)
{
	if(x>3)
	{
		if(val(j,1,n,m)<v*4) return false;
		if(ok(v)) return true;
		else
		return false;
	}
	for(int i=j;i<=n;i++)
	{
		if(val(j,1,i,m)>=v*4)
		{
			d[x]=i;
			if(dg(x+1,i+1,v)) return true;
		}
	}
	return false;
}
int main()
{
	scanf("%d%d\n",&n,&m);
	int num=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			char c=getchar();
			while(c<'0' ||  c>'9') c=getchar();
			a[i][j]=c-'0';
			num+=a[i][j];
		}
	for(int i=1;i<=n;i++) a[i][m+1]=100;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m+1;j++)
			sum[i][j]=a[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
	int l=0,r=num/16;
	while(l+1<r)
	{
		int mid=(l+r)/2;
		if(dg(1,1,mid)) l=mid;
		else r=mid;
	}
	if(dg(1,1,r)) printf("%d",r);
	else printf("%d",l);
}
【NOIP2014模拟11.3】蛋糕的更多相关文章
- JZOJ 3929. 【NOIP2014模拟11.6】创世纪
		3929. [NOIP2014模拟11.6]创世纪 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description 上帝手 ... 
- JZOJ 3928. 【NOIP2014模拟11.6】射击
		3928. [NOIP2014模拟11.6]射击 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description 有问题, ... 
- JZOJ 3927. 【NOIP2014模拟11.6】可见点数
		3927. [NOIP2014模拟11.6]可见点数 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description ZP ... 
- 【NOIP2014模拟11.3】噪音
		题目 FJ有M个牛棚,编号1至M,刚开始所有牛棚都是空的.FJ有N头牛,编号1至N,这N头牛按照编号从小到大依次排队走进牛棚,每一天只有一头奶牛走进牛棚.第i头奶牛选择走进第p[i]个牛棚.由于奶牛是 ... 
- JZOJ 3509. 【NOIP2013模拟11.5B组】倒霉的小C
		3509. [NOIP2013模拟11.5B组]倒霉的小C(beats) (File IO): input:beats.in output:beats.out Time Limits: 1000 ms ... 
- JZOJ 3508. 【NOIP2013模拟11.5B组】好元素
		3508. [NOIP2013模拟11.5B组]好元素(good) (File IO): input:good.in output:good.out Time Limits: 2000 ms Mem ... 
- 8.1 NOIP模拟11
		8.1 NOIP模拟 11 今天上午返校之后,颓了一会,然后下午就开始考试,中午睡着了,然后刚开始考试的时候就困的一匹,我一看T1,woc,这不是之前线段树专题的题啊,和那道题差不多,所以我..... ... 
- JZOJ 3518. 【NOIP2013模拟11.6A组】进化序列(evolve)
		3518. [NOIP2013模拟11.6A组]进化序列(evolve) (File IO): input:evolve.in output:evolve.out Time Limits: 1000 ... 
- JZOJ 3505. 【NOIP2013模拟11.4A组】积木(brick)
		3505. [NOIP2013模拟11.4A组]积木(brick) (File IO): input:brick.in output:brick.out Time Limits: 1000 ms Me ... 
随机推荐
- Java基础之Volatile原理
			原文链接: http://www.aoaoyi.com/archives/956.html 计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据 的读取和写入.由于程序运 ... 
- Docker面试题(二)
			什么是虚拟化? 虚拟化允许您在相同的硬件上运行两个完全不同的操作系统.每个客户操作系统都经历了引导,加载内核等所有过程.您可以拥有非常严格的安全性,例如,客户操作系统无法完全访问主机操作系统或其他客户 ... 
- TensorFlow基础总结
			1.基础概念 Tensor:类型化的多维数组,图的边:Tensor所引用的并不持有具体的值,而是保持一个计算过程,可以使用session.run()或者t.eval()对tensor的值进行计算. O ... 
- 【转载】GitHub 标星 1.2w+,超全 Python 常用代码合集,值得收藏!
			本文转自逆袭的二胖,作者二胖 今天给大家介绍一个由一个国外小哥用好几年时间维护的 Python 代码合集.简单来说就是,这个程序员小哥在几年前开始保存自己写过的 Python 代码,同时把一些自己比较 ... 
- MySQL 常用命令和基础语法
			-- mysql 命令 SHOW DATABASES; #查看目前系统中存在的数据库 use database_name; #切换数据库 SHOW TABLES; #显示当前数据库下面的所有可用的表 ... 
- RPCVersionCapError: Requested message version, 4.17 is incompatible.  It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
			[问题描述] RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in ... 
- Win10 开启 热点的简单办法
- 不用 Notepad++,还有更牛逼的选择!
			来源:oschina.net/news/110987/no-notepad-plus-plus 这两天 Notepad++ 牛逼了,然后引发了大家的关注,具体事件内容请大家自行百度,其实作为文本编辑工 ... 
- dp常见优化方法
			noip范围内的dp优化方法: 加速状态转移 1.前缀和优化 2.单调队列优化 3.线段树或树状数组优化 精简状态 3:精简状态往往是通过对题目本身性质的分析,去省掉一些冗余的状态.相对以上三条套路性 ... 
- 滑雪(dp或记忆化搜索)
			题意:给你一个二维数组,求最长的递减路线的长度,只能向四个方向延伸. 解法1.dp[i][j]以i.j结尾的最长路线长度.边界:每个数初值为1, 转移:从四周向i.j转移,if(a[i][j]> ... 
