【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;
}

转载于:https://www.cnblogs.com/CQzhangyu/p/7629408.html

【BZOJ4716】假摔 二分+暴力相关推荐

  1. bzoj4716假摔

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

  2. bzoj4716: 假摔

    BZOJ4716: 假摔 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 10  Solved: 7 [Submit][Status][Discuss ...

  3. BZOJ4716 假摔

    标签:STL,贪心 题目 题目传送门 假摔(flopping.pas/c/cpp/in/out) [题目背景] 小Q最近喜欢上了一款游戏,名为<舰队connection>,在游戏中,小Q指 ...

  4. 【BZOJ】4716 假摔

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

  5. 牛客小白月赛28 E-会当凌绝顶,一览众山小 线段树+二分暴力模拟

    牛客小白月赛28 E-会当凌绝顶,一览众山小 线段树+二分暴力模拟 题意 思路 Code 传送门: https://ac.nowcoder.com/acm/contest/16081/E 题意 登山顺 ...

  6. EOJ #3452 唐纳德先生和假骰子【暴力】

    题目链接 题目意思 给你一个数字p,代表人数,接着给出你两个骰子的六个面的数值,现在要你将骰子向上的点数和对人数取余,得到的余数分别为0到p-1,现在问你游戏是否公平. 解题思路 数值很小我们就用暴力 ...

  7. 银行系统日终结算要多久_美股顽强翻红!两连跌终结,联储降息预期已超九成!制造业疲软消费者信心坚挺,三大股指又假摔?...

    美国股市昨日先抑后扬终结两连跌,开启反弹,道指.标普.纳指纷纷翻红. 10月3日晚,美东时间周四,美股集体低开,盘初受宏观经济数据不及预期影响,三大指数大幅跳水跌逾1%,道指跌超300点.此后美股开启 ...

  8. 练习假摔(视频, 超搞笑)

    [align=center][flash=420,380]http://v.9you.com/player/go1dk9nru[/flash][/align]

  9. BZOJ 4716 假摔

    我们发现我们可以对每一个点维护其还没有用过的矩形中最小的几个,记得判重. #pragma GCC optimize("-O2") #include<bits/stdc++.h ...

最新文章

  1. 大规模环境下基于语义直方图的多机器人实时全局定位图匹配
  2. Kinect For Windows V2开发日志九:侦测并绘制人体骨架
  3. recv, recvfrom, recvmsg
  4. 串口 多个activity 安卓_Android-EasySerialPort
  5. mysql general clomun_关于MySQL索引index杂谈
  6. 【codevs1036】商务旅行,LCA练习
  7. C开源hash代码uthash的用法总结(2)
  8. python sklearn 绘制决策树模型的节点图
  9. [转]加载纹理与使用glGenTextures时应注意的一点(解决吃内存)
  10. 无敌打印(适用各种浏览器自带打印功能)
  11. 基于Python实现的遗传算法求TSP问题
  12. 贪吃蛇游戏-小程序游戏
  13. 软件项目经理应具备的素质和条件_一个合格的软件项目经理应该具备哪些条件?...
  14. React项目实战(一)
  15. 文件或目录损坏且无法读取怎么办?数据恢复用这招
  16. 所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
  17. java判断生日_java根据生日判断生日和星座
  18. jsp调试java_[求助]jsp+javaBean调试环境问题!
  19. android中小火箭动态喷射动画的简单实现
  20. 5.3中断系统中的设备树——中断号的演变与irq_domain

热门文章

  1. 【Python学习笔记(一)—— 初识Python】
  2. Python使用网易的SMTP发送邮件554问题的解决
  3. 具有对称性质的单参数混沌镜像系统的切换控制
  4. UDK 脚本编译运行
  5. 狗为什么吃屎?真相男默女泪,但看完后你也会流口水......
  6. JS-DOM对象--节点--添加图片的操作
  7. 如何使用Python爬取基金数据,并可视化显示
  8. Java笔记-11 多线程
  9. Linux 学习笔记——二、主机规划与磁盘分区
  10. Android怎么保证广播安全,Android 广播机制安全性研究.PDF