博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ2196: [Usaco2011 Mar]Brownie Slicing
阅读量:4608 次
发布时间:2019-06-09

本文共 1197 字,大约阅读时间需要 3 分钟。

n<=500 * m<=500的方阵,先沿横坐标切A-1刀,再把每一块切B-1刀,得到A*B块,求这A*B块的数字之和的最小值的最大值。

最小值最大--二分,然后贪心切。每次扫一行,看这一行能不能切成满足二分值的B块,如果能就记可行横条块多一,最后看可行横条块能否到A,如不能则继续扫下一行,把没满足条件的这行并起来计算。由于需要把连续几行并起来求子矩阵和,需要预处理一波。

1 #include
2 #include
3 #include
4 #include
5 #include
6 //#include
7 using namespace std; 8 9 int n,m,A,B;10 #define maxn 51111 int a[maxn][maxn],sum[maxn][maxn];12 bool check(int x)13 {14 int lx=0,cntx=0;15 for (int i=1;i<=n;i++)16 {17 int ly=0,cnty=0;18 for (int j=1;j<=m;j++)19 if (sum[i][j]-sum[lx][j]-sum[i][ly]+sum[lx][ly]>=x)20 cnty++,ly=j;21 if (cnty>=B) cntx++,lx=i;22 }23 return cntx>=A;24 }25 int main()26 {27 scanf("%d%d%d%d",&n,&m,&A,&B);28 int tot=0;29 for (int i=1;i<=n;i++)30 for (int j=1;j<=m;j++)31 scanf("%d",&a[i][j]),tot+=a[i][j];32 memset(sum,0,sizeof(sum));33 for (int i=1;i<=n;i++)34 for (int j=1;j<=m;j++)35 sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];36 int L=-1,R=tot;37 while (L
>1;40 if (check(mid)) L=mid;41 else R=mid-1;42 }43 printf("%d\n",L);44 return 0;45 }
View Code

 

转载于:https://www.cnblogs.com/Blue233333/p/7551578.html

你可能感兴趣的文章
【CF343D】 Water Tree(树链剖分)
查看>>
Asp.net MVC源码分析--获取ModelBinder的优先级
查看>>
地图与定位
查看>>
Python-递归初识-50
查看>>
hadoop-mapreduce-架构概念
查看>>
Ubunru 16.04 kinetic 下安装turtlebot2
查看>>
参数为数组的方法
查看>>
原创:局域网控制系统-下位机-单片机
查看>>
[Selenium+Java] Desired Capabilities in Selenium
查看>>
创建Visual studio项目模板 vstemplate关键点纪要
查看>>
工作4年的老腊肉的总结
查看>>
转: 详解css中的display属性
查看>>
主导2015年的网页设计趋势
查看>>
对象转数组并倒序
查看>>
aspx页面中写if else 语句的方法,
查看>>
VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNTION(翻译)
查看>>
UVA 10539 - Almost Prime Numbers 素数打表
查看>>
Laravel核心之IOC和Facade 架构分析1
查看>>
C++ 的输出格式
查看>>
好用的XML序列,简单接口
查看>>