Usaco*Brownie Slicing
2018-06-17 23:30:13来源:未知 阅读 ()
Description
Input
Output
Sample Input
1 2 2 1
3 1 1 1
2 0 1 3
1 1 1 1
1 1 1 1
Sample Output
1 #include<cstdio>
2 #include<iostream>
3 using namespace std;
4 int a[501][501]={0};
5 int r,c,a1,b1;
6
7 bool check(int now)//判断当前答案的正确性
8 {
9 int tot=0,x=0,y=0,j=0,i=0,lasti=0;
10 while (i<r)//i为访问到第几行,避免越界
11 {
12 ++i;
13 j=0;
14 y=0;//当前(lasti~i这一块面包被竖着切成y块面包)
15 while ((j<c)&&(y<b1))
16 {
17 tot=0;
18 while ((tot<now)&&(j<c))//利用贪心,一列一列加
19 {
20 ++j;
21 for (int i2=lasti+1;i2<=i;++i2)
22 tot=tot+a[i2][j];
23 }
24 if (tot>=now)//如果可以产生一块新的面包,则将y+1
25 ++y;
26 }
27 if (y>=b1)//当lasti~i行的面包能被切成大于等于B(b1)块且每一块的碎屑都大于mid,x+1,开始枚举下一次该切在哪
28 {
29 ++x;
30 lasti=i;
31 }
32 }34 if (x>=a1)
35 return true;
36 return false;
37 }
38
39 int main()
40 {
41 cin>>r>>c>>a1>>b1;
42 int right=0;
43 for (int i=1;i<=r;++i)
44 for (int j=1;j<=c;++j)
45 {
46 cin>>a[i][j];
47 right+=a[i][j];
48 }
49 int ans=0,left=0,mid=0;
50 while (left<=right)//二分答案
51 {
52 mid=(left+right)/2;
53 if (check(mid)==true)
54 {
55 left=mid+1;
56 ans=mid;//避免出现死循环
57 }
58 else right=mid-1;
59 }
60 cout<<ans<<endl;
61 return 0;
62 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 题解 P5116 【[USACO18DEC]Mixing Milk】 2020-03-14
- 【做题笔记】P2871 [USACO07DEC]手链Charm Bracelet 2020-02-14
- LuoguP3069 【[USACO13JAN]牛的阵容Cow Lineup 2019-10-30
- P2995 [USACO10NOV]牛的照片(树状数组,逆序对) 2019-10-25
- 洛谷 P3144 [USACO16OPEN]关闭农场Closing the Farm_Silver 2019-09-02
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash