【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 ...
随机推荐
- 用DotNetDetour HOOK .net类库
https://github.com/bigbaldy1128/DotNetDetour ------------------------------------------------------- ...
- AWSome Day简介
AWSome Day是什么? 它是一场为时一天.结合教育与技术新知的云计算技术免费研讨会.是面向所有开发人员.IT技术人员.或技术/业务领域决策者必备的基础云计算课程.AWS专业级讲师将在现场带领您从 ...
- python--008文件处理
一.文件操作 1.打开文件,获得文件句柄,并将句柄赋值给一个变量 2.通过句柄对文件操作 3.关闭文件 f=open('sg',encoding='utf-8') da=f.read() print( ...
- 【LeetCode】309、最佳买卖股票时机含冷冻期
Best Time to Buy and Sell Stock with Cooldown 题目等级:Medium 题目描述: Say you have an array for which the ...
- 【转帖】UDIMM、RDIMM、SODIMM以及LRDIMM的区别
转载自http://www.sohu.com/a/165343889_781333. DIMM简介 DIMM(Dual Inline Memory Module,双列直插内存模块)与SIMM(sing ...
- Spring(六)--Spring配置文件之间的关系
Spring配置文件之间的关系 1.需要的实体类 2.需要的xml文件 3.测试类 未完待续!!!
- 拉勾网python开发要求爬虫
#今日目标 **拉勾网python开发要求爬虫** 今天要爬取的是北京python开发的薪资水平,招聘要求,福利待遇以及公司的地理位置. 通过实践发现除了必须携带headers之外,拉勾网对ip访问频 ...
- python计算1~100的和,1~100奇数的和,1~100偶数的和,一条代码求1~100的和
1.计算1~100的数之和----for循环实现1~100的和 sum1 = ,): sum1 = sum1 + i i += print(f"1-100之间的和是:{sum1}" ...
- [..net core]4.入口,Main方法 及InProcess
通常控件台程序都有一个main方法, public class Program { public static void Main(string[] args) { CreateWebHostBuil ...
- 剑指offer 数字翻译成字符串
0 -> 'a', 1->'b', ..., 11 -> 'l', ..., 25->'z'. 计算一个数有多少种不同的翻译方法. 分析:记f[i]表示从第i位起的不同翻译数目 ...