Day4:T1小技巧(类似于指针操作)T2搜索+小细节
Day4:其中有很多小技巧get
T1
一直没有听到过像这样的小技巧的略专业名词,有点类似于指针操作,之前有碰到过很多这样的题目
每次都是以不同的形式出现,但是感觉思想还是有点接近的吧(就比如某天有一题happy,貌似也是这类型的)
这类题目第一眼总是看起来特别的不能写,其实想到了这些技巧之后很简单
感觉这也没有什么规律性或是模板可言
大概的,就是指针思想+平时积累吧
说说这一题吧
在分析正解之前,我们先说一说比较容易想到的骗分方法
设男女人数相同时ans=0,如果下一个是男->ans++,else ans--;
找到ans=0时,记录下此时的位置,把这个位置和上个位置相减
之后再扫一遍答案,把连续的相加即可
这种方法很简单也比较容易想到,但是这只是O(N2)的算法,只能过50%的数据
那正解是什么样的呢?
其实也就是以上骗分方法的改进而已;
想想其实我们并不需要找ans=0的情况,只需要前面的ans和后面再次出现相同的ans值,即可知男女人数相同(换句话说就是,男生比女生多多少或少多少相同)
用一个数组pos[i ]记录“1”的个数比“0”的个数多i个时第一次出现的位置(i可以为负数,表示“1”的个数比“0”少)。
当扫描到某个位置w时发现pos[x]已经有值了,我们就得到了从第pos[x]+1个数到第w个数的子序列满足条件,于是用w-pos[x]去更新满足条件的子序列长度的最大值。为了方便处理x为0的情况,我们规定,pos[0]=0。
for i:=1 to n do
begin
read(x);
if x=1 then inc(duo) else dec(duo);
if (a[duo]=0) and (duo<>0) then a[duo]:=i
else if i-a[duo]>ans then ans:=i-a[duo];
end;
很棒的思路,主要是懂得理解和运用a数组,当a[duo]!=0的时候就记录位置
然而这种方法也巧妙的避开了骗分方法中找连续区间的必要,因为它一开始就是记录duo第一次出现的位置!!
MARK
//对了,由于c++里面数组是没有负数位置的,所以duo最好赋为100000
T2:搜索
是一个很棒的题目
很明显的看出这是一个很典型的搜索题,但是怎么搜,怎么思考其实才是问题的关键
首先思维不能只是局限人如何走,走了之后,如何判断是否能射到?
如果这样想的话,写出来的程序一定会很复杂
有没有更简单的思路呢?
答案是肯定的。
换一种思路去想,假定人不动,预处理出一次人能够一次射到的位置;
然后移动目标点,搜目标点移动到人可射的位置不就解决问题了嘛!
QAQ...一切都是智商的错啊!!
想清楚了之后,只要仔细的预处理出八个方位能射到的点
然后在bfs一下即可:
附上代码:
const
dx:array[1..4] of -1..1=(0,0,-1,1);//起点往四个方向扩展。
dy:array[1..4] of -1..1=(-1,1,0,0); var
n,m,i,j,x1,y1,x2,y2,cx,cy:longint;
map:array[-10..200,-10..200] of char;
hx,hy,hd:array[1..20000] of longint;//队列
bo:array[-10..200,-10..200] of boolean; function bfs(x,y:longint):boolean;
var
chong:array[-10..200,-10..200] of boolean;//判重
head,tail,i,j,x3,y3,x4,y4,long:longint; begin
fillchar(hx,sizeof(hx),0);
fillchar(hy,sizeof(hy),0);
fillchar(hd,sizeof(hd),0);
bfs:=false;
fillchar(chong,sizeof(chong),false);
head:=0;tail:=1;hx[1]:=x;hy[1]:=y;hd[1]:=0;
chong[x,y]:=true;
while head<tail do//从起点向四面八方扩展
begin
inc(head);
x3:=hx[head];y3:=hy[head];long:=hd[head];
for i:=1 to 4 do
begin
x4:=x3+dx[i];y4:=y3+dy[i];
if (x4>=1) and (x4<=n) and (y4>=1) and (y4<=m) and (map[x4,y4]='O') and (not chong[x4,y4]) then//要判重
begin
chong[x4,y4]:=true;
if bo[x4,y4] then begin writeln(long+1);exit(true);end;
inc(tail);
hx[tail]:=x4;
hy[tail]:=y4;
hd[tail]:=long+1;
end;
end;
end;
end; begin
assign(input,'dragon.in');
reset(input);
assign(output,'dragon.out');
rewrite(output);
readln(n,m);
for i:=1 to n do
begin
for j:=1 to m do
read(map[i,j]);
readln;
end;
readln(x2,y2,x1,y1);
while (x1<>0) or (y1<>0) or (x2<>0) or (y2<>0) do//对四面八方进行预处理 以下片段可以缩成一个过程
begin
fillchar(bo,sizeof(bo),false);
bo[x2,y2]:=true;
for i:=y2 to m do
if map[x2,i]='O' then bo[x2,i]:=true else break; for i:=y2-1 downto 1 do
if map[x2,i]='O' then bo[x2,i]:=true else break;//横向 for i:=x2 to n do
if map[i,y2]='O' then bo[i,y2]:=true else break; for i:=x2-1 downto 1 do
if map[i,y2]='O' then bo[i,y2]:=true else break;//纵向 cx:=x2;cy:=y2;
while (cx>=1) and (cy<=m) and (map[cx,cy]='O') do//右上
begin
bo[cx,cy]:=true;
dec(cx);
inc(cy);
end; cx:=x2;cy:=y2;
while (cx<=n) and (cy>=1) and (map[cx,cy]='O') do//左下
begin
bo[cx,cy]:=true;
inc(cx);
dec(cy);
end; cx:=x2;cy:=y2;
while (cx>=1) and (cy>=1) and (map[cx,cy]='O') do//左上
begin
bo[cx,cy]:=true;
dec(cx);
dec(cy);
end; cx:=x2;cy:=y2;
while (cx<=n) and (cy<=m) and (map[cx,cy]='O') do//右下
begin
bo[cx,cy]:=true;
inc(cx);
inc(cy);
end;//以上四个段落是对角线方向 if bo[x1,y1] then writeln(0) else//如果直接可以达到那么就直接判0
if not bfs(x1,y1) then writeln('Impossible!');
readln(x2,y2,x1,y1);
end;
close(input);
close(output);
end.
Day4:T1小技巧(类似于指针操作)T2搜索+小细节的更多相关文章
- 积累的VC编程小技巧之文件操作
1.删除文件夹 // 删除文件夹及其所有内容void CBaseDoc::RemoveFolder(const CString &strPathName){ CString path = ...
- 积累的VC编程小技巧之树操作
1.如何在TreeList中加图标? [问题提出] 请问treeview控件和treectrl控件的用法有何不同呢?向如何imagelist控件中加图象呀? [解决方法] 1) HICON ...
- 【小技巧】只用css实现带小三角的对话框样式
一个小小的技巧: 如图所示,这种小三角,不用图片,只用css怎么实现呢? 直接上代码吧: <!DOCTYPE html> <html> <head> <tit ...
- VM小技巧——虚拟机解决vm窗口太小的办法
——" 慢下来总结才能增大效率" 很多人在装虚拟机的时候,遇到了窗口过小不能自适应的问题.我也是查了好多资料,都说安装Vmware Tools即可解决,还有说修改分辨率也可以.两种 ...
- 最强 Android Studio 使用小技巧和快捷键
写在前面 本文翻译自 Android Studio Tips by Philippe Breault,一共收集了62个 Android Studio 使用小技巧和快捷键. 根据这些小技巧的使用场景,本 ...
- 最强 Android Studio 使用小技巧和快捷键总结
最强 Android Studio 使用小技巧和快捷键总结 写在前面 本文翻译自 Android Studio Tips by Philippe Breault,一共收集了62个 Android ...
- Android Studio 使用小技巧和快捷键
Android Studio 使用小技巧和快捷键 Alt+回车 导入包,自己主动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt ...
- Intellij IDEA神器那些让人爱不释手的小技巧
完整的IDEA使用教程,GitHub地址: https://github.com/judasn/IntelliJ-IDEA-Tutorial 概述 之前写了一篇介绍IntellIJ IDEA的文章 ...
- 人人必知的10个 jQuery 小技巧
原文地址:http://info.9iphp.com/10-jquery-tips-everyone-should-know/ 人人必知的10个 jQuery 小技巧 收集的10个 jQuery ...
随机推荐
- N-gram统计语言模型(总结)
N-gram统计语言模型 1.统计语言模型 自然语言从它产生開始,逐渐演变成一种上下文相关的信息表达和传递的方式.因此让计算机处理自然语言.一个主要的问题就是为自然语言这样的上下文相关特性建立数学模型 ...
- 怎样用OleDbDataAdapter来对数据库进行操作?
请问怎样用OleDbDataAdapter来对数据库进行删除.改动和加入? OleDbDataAdapter是DataSet和数据源之间建立联系的重要纽带.用它我们能够对数据库进行删除.改动和加入 ...
- SSH—Struts(三)—跑步者(Action)
如已经描述Struts其基本原理和控制器ActionServlet,根据一个请求通过流ActionServlet之后就要到达Action类中做详细的处理了.ActionServlet通过ActionM ...
- DRP学习进化模型
曾经做的就是按照思维做的三级制,这是U .B ,D .坐在坐,开始增加设计模式,增加sqlhelper ,逐渐了解系统可分为只三层,层的,随着学习的不断深入明确了"为什么会出现分层" ...
- cocos2d-x 3.2 2048——第六部分(最后一章)
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- 表现层及ASP.NET MVC介绍(二)
表现层及ASP.NET MVC介绍(二) 最近的更新速度越来越慢,主要是项目上比较忙,封装EasyUi也要花很多时间.不过大家请放心,本系列不会半途夭折,并且代码干货也会持续更新.本文继续介绍表现层和 ...
- Effective C++ 10
10.假设写了operator new,就要同一时候写operator delete. 为什么要写自己的operator new和delete,首先这不叫重载,这叫隐藏. new仅仅是用来申请空间,而 ...
- 泛型委托及委托中所涉及到匿名方法、Lambda表达式
泛型委托及委托中所涉及到匿名方法.Lambda表达式 引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到 ...
- 转载:善待Redis中的数据
Redis是我们数据的保管者,我们可以随时存随时取,大的小的,重要的不重要的,它都毫无怨言的帮我们保存着,甚至有些时候,我们变得很懒,存东西进去的时候顺便还贴张纸:"过了一个星期就帮我扔了吧 ...
- Ajax实现在textbox中输入内容,动态从数据库中模糊查询显示到下拉框中
功能:在textbox中输入内容,动态从数据库模糊查询显示到下拉框中,以供选择 1.建立一aspx页面,html代码 <HTML> <HEAD> <title>We ...