【BZOJ4716】假摔

Description

【题目背景】
小Q最近喜欢上了一款游戏,名为《舰队connection》,在游戏中,小Q指挥强大的舰队南征北战,从而成为了一名dalao。在游戏关卡的攻略中,可能由于作战过程中某艘船受到严重损伤,为避免沉没而被迫进行返航,这种情况大家称为这艘船“假摔”。小Q最喜欢使用的一艘战舰代号为P01,但是最近这艘船总是用各种不同的姿势假摔,于是小Q打算研究一下原因。
【题意描述】
P01的装甲可以近似看作一个n*m的矩阵,每个位置上的数字代表这个位置装甲的强度。当受到炮击时,防御力为被炮击的部分的所有位置强度之和。最近小Q发现,敌方有一种船只被称为ENE,它可以发射不同形状的炮弹,以达到攻击装甲最薄弱处的目的。P01已经被连续k次用不同方式打成了严重损伤(假摔),于是小Q打算分析一下ENE的攻击力。为了简单起见,我们作如下假设:
1、ENE的炮弹形状无论如何变化,火力值都为一个定值(整数,未知)
2、ENE的炮弹形状只能是长方形(ENE:呵呵),且由于口径的限制,炮弹不能太小(具体来说,对于每一发炮弹长xi宽yi,有xmin<=xi<=n,ymin<=yi<=m)
3、当ENE的炮击命中P01的某处装甲时,被命中部分的强度之和为P01的防御力,此时,ENE的火力必须严格大于P01的防御力,才能将其击穿并造成严重损伤(假摔)。
然而,小Q并没有得到详细的中弹数据,只知道P01用k种不同的方式假摔过。两种假摔方式不同,当且仅当受到炮击的位置不完全相同。因此,不同形状的炮弹击穿护甲时必定可以造成不同的假摔方式,而相同形状的炮弹在不同的位置击穿护甲也能造成不同的假摔方式。现在,小Q想估计ENE的火力最低是多少。于是,这个任务被交给了你。
举例而言,假设P01的护甲为3*4:
0 1 3 7
1 1 5 5
7 6 9 6
如果ENE的口径至少为2*2,那么直接使用2*2的炮弹攻击左上角2*2的装甲时,只要火力>=4即可造成一种假摔。如果想造成k=3种不同的假摔方式,至少要拥有12的火力,此时可以造成如下三种假摔方式:
1、2*2炮弹,攻击有数字的部分,装甲值为3
0 1 - -
1 1 - -
- - - -
2、2*2炮弹,攻击有数字的部分,装甲值为10
- 1 3 -
- 1 5 -
- - - -
3、2*3炮弹,攻击有数字的部分,装甲值为11
0 1 3 -
1 1 5 -
- - - -
可以证明,火力小于12时,无法造成3种不同的假摔方式,所以ENE的火力至少应为12。

Input

第一行,五个数n, m, xmin, ymin, k,空格分隔。
接下来n行,每行m个数,空格分隔,表示P01的装甲。
1<=n,m<=1000,1<=xmin<=n, 1<=ymin<=m, 1<=k<=250000,装甲值为不超过2000的非负整数。
保证火力为无穷大的ENE可以造成k种不同的假摔方式。

Output

仅一行,一个数,表示ENE的火力最低值。

Sample Input

3 4 2 2 3
0 1 3 7
1 1 5 5
7 6 9 6

Sample Output

12

题解:一开始瞎写了写没写出来,看网上的题解神的不行,后来发现网上的题解都想多了!!!直接二分+暴力就行!

先二分答案,然后枚举右下角的点,然后不断移动左上角的点,直到不能再移动为止。因为每次移动要么会break要么会使方案数+1,并且k<250000,所以总复杂度是有保证的!是O(log(ans)*(n*m+k))!

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n,m,xn,yn,K;
int s[1010][1010];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
inline int calc(int a,int b,int c,int d)
{
return s[c][d]-s[a][d]-s[c][b]+s[a][b];
}
bool check(int x)
{
register int i,j,a,b;
int ret=K;
for(i=xn;i<=n;i++) for(j=yn;j<=m;j++)
{
for(a=i-xn;a>=0&&calc(a,j-yn,i,j)<x;a--) for(b=j-yn;b>=0&&calc(a,b,i,j)<x;b--)
{
ret--;
if(!ret) return 1;
}
}
return 0;
}
int main()
{
n=rd(),m=rd(),xn=rd(),yn=rd(),K=rd();
int i,j;
for(i=1;i<=n;i++) for(j=1;j<=m;j++) s[i][j]=s[i-1][j]-s[i-1][j-1]+s[i][j-1]+rd();
int l=0,r=s[n][m]+1,mid;
while(l<r)
{
mid=(l+r)>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
printf("%d",r);
return 0;
}

【BZOJ4716】假摔 二分+暴力的更多相关文章

  1. bzoj4716假摔

    bzoj4716假摔 题意: 给出一个矩阵,求这个矩阵中权值和第k小的长在xmin到n之间,宽在ymin到m之间的子矩阵.n,m≤1000,k≤250000. 题解: 首先求出长为xmin,宽为ymi ...

  2. bzoj4716 假摔

    Description [题目背景] 小Q最近喜欢上了一款游戏,名为<舰队connection>,在游戏中,小Q指挥强大的舰队南征北战,从而成为了一名 dalao.在游戏关卡的攻略中,可能 ...

  3. 【bzoj5085】最大 二分+暴力

    题目描述 给你一个n×m的矩形,要你找一个子矩形,价值为左上角左下角右上角右下角这四个数的最小值,要你最大化矩形的价值. 输入 第一行两个数n,m,接下来n行每行m个数,用来描述矩形 n, m ≤ 1 ...

  4. Codeforces 778A:String Game(二分暴力)

    http://codeforces.com/problemset/problem/778/A 题意:给出字符串s和字符串p,还有n个位置,每一个位置代表删除s串中的第i个字符,问最多可以删除多少个字符 ...

  5. 10年省赛-Greatest Number (二分+暴力) + 12年省赛-Pick apples(DP) + UVA 12325(暴力-2次枚举)

    题意:给你n个数,在里面取4个数,可以重复取数,使和不超过M,求能得到的最大的数是多少: 思路:比赛时,和之前的一个题目很像,一直以为是体积为4(最多选择四次)的完全背包,结果并不是,两两求和,然后二 ...

  6. LeetCode 81 - 搜索旋转排序数组 II - [二分+暴力]

    假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在于数组中. ...

  7. D. Fedor and coupons 二分暴力

    http://codeforces.com/contest/754/problem/D 给出n条线段,选出k条,使得他们的公共部分长度最大. 公共部分的长度,可以二分出来,为val.那么怎么判断有k条 ...

  8. #424 Div2 Problem C Jury Marks (二分 && 暴力 && std::unique && 思维)

    题目链接 :http://codeforces.com/contest/831/problem/C 题意 :选手有一个初始积分,接下来有k个裁判为他加分或减分(时间顺序给出),然后告诉你n(1< ...

  9. HDU 1496 Equations 等式(二分+暴力,技巧)

    题意:给出4个数字a,b,c,d,求出满足算式a*x1^2+b*x2^2+c*x3^2+d*x4^2=0的 (x1,x2,x3,x4) 的组合数.x的范围[-100,100],四个数字的范围 [-50 ...

随机推荐

  1. cocos2d-之音乐背景播放

    1.先加入头文件 #include <SimpleAudioEngine.h> using namespace CocosDenshion;//为了方便以下的函数使用,使用命名空间 2.在 ...

  2. [转]2年SQL Server DBA调优方面总结

      2年SQL Server DBA调优方面总结 当2年dba 我觉得,有些东西需要和大家分享探讨,先书单. 书单 1.<深入解析SQL Server 2008 系列> 这个就是mssql ...

  3. Drawing-Order-Of-meshes-and-sprites

    Sprite 和 Mesh Render 共存 [CanEditMultipleObjects] [CustomEditor(typeof(MeshRenderer))] public class M ...

  4. 普通用户 crontab 任务不运行

    今天发如今linux下,普通用户的crontab任务不运行.网上搜了好多.好多说要在运行的脚本前面加上例如以下内容 if [ -f ~/.bash_profile ]; then   . ~/.bas ...

  5. ajax--百度百科

    AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异步 JavaScript和 ...

  6. 道具搜索框(|=, & , ^=)实现的列子

    需求: 勾上界面上多选框筛选出符合的道具 思路: 1. 使用组合数字让一个数字包含多这个搜索条件,比如2代表搜索衣服和武器, 数字按照2的n次幂的值递增,通过|,&,^运算符实现一个数字包含多 ...

  7. angular4 开发记录

    1,传值问题 page setValue:  [routerLink]="['/product-details', product.id]"> ts     seValue: ...

  8. composer 初始化办法和方法

    php -r "readfile('https://getcomposer.org/installer');" > composer-setup.php php -r &qu ...

  9. Nginx HttpSubModule sub_filter模块的过滤功能

    Nginx HttpSubModule sub_filter模块的过滤功能 发表于2年前(2013-08-05 10:39)   阅读(1481) | 评论(0) 0人收藏此文章, 我要收藏 赞0 5 ...

  10. 常用校验算法CRC、MD5、SHA_转

    1.算法概述 数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名.数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密.数据摘要算法也被称为哈希(H ...