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搜索+小细节的更多相关文章

  1. 积累的VC编程小技巧之文件操作

    1.删除文件夹 // 删除文件夹及其所有内容void CBaseDoc::RemoveFolder(const CString &strPathName){    CString path = ...

  2. 积累的VC编程小技巧之树操作

    1.如何在TreeList中加图标? [问题提出]  请问treeview控件和treectrl控件的用法有何不同呢?向如何imagelist控件中加图象呀?  [解决方法]  1)    HICON ...

  3. 【小技巧】只用css实现带小三角的对话框样式

    一个小小的技巧: 如图所示,这种小三角,不用图片,只用css怎么实现呢? 直接上代码吧: <!DOCTYPE html> <html> <head> <tit ...

  4. VM小技巧——虚拟机解决vm窗口太小的办法

    ——" 慢下来总结才能增大效率" 很多人在装虚拟机的时候,遇到了窗口过小不能自适应的问题.我也是查了好多资料,都说安装Vmware Tools即可解决,还有说修改分辨率也可以.两种 ...

  5. 最强 Android Studio 使用小技巧和快捷键

    写在前面 本文翻译自 Android Studio Tips by Philippe Breault,一共收集了62个 Android Studio 使用小技巧和快捷键. 根据这些小技巧的使用场景,本 ...

  6. 最强 Android Studio 使用小技巧和快捷键总结

    最强 Android Studio 使用小技巧和快捷键总结   写在前面 本文翻译自 Android Studio Tips by Philippe Breault,一共收集了62个 Android ...

  7. Android Studio 使用小技巧和快捷键

    Android Studio 使用小技巧和快捷键 Alt+回车 导入包,自己主动修正 Ctrl+N   查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L  格式化代码 Ctrl+Alt ...

  8. Intellij IDEA神器那些让人爱不释手的小技巧

      完整的IDEA使用教程,GitHub地址: https://github.com/judasn/IntelliJ-IDEA-Tutorial 概述 之前写了一篇介绍IntellIJ IDEA的文章 ...

  9. 人人必知的10个 jQuery 小技巧

    原文地址:http://info.9iphp.com/10-jquery-tips-everyone-should-know/ 人人必知的10个 jQuery 小技巧   收集的10个 jQuery ...

随机推荐

  1. crontab 里不能运行expdp

    编辑脚本 xxx.sh #!/bin/shrq=`date +%Y%m%d`filename="test$rq"expdp system/*** directory=expdump ...

  2. DynamicReports 导出Excel 例子

    import java.awt.Color; import java.io.FileOutputStream; import java.util.ArrayList; import java.util ...

  3. DM8168 layout

    我们学到了以前的系统板的教训,新的版本号DM8168烤... 一级:电源.DM8168.DDR3.FPGA.CPLD.Nandflash.USB.以太网络.SATA.JTAG等待. 的地面电源部充分. ...

  4. hdu 1002 Java 大数 加法

    http://acm.hdu.edu.cn/showproblem.php?pid=1002 PE   由于最后一个CASE不须要输出空行 import java.math.BigInteger; i ...

  5. C# mongodb 1

    转载C# mongodb 概述 MongoDB是一个高性能,开源,无模式的文档型数据库,使用C++开发.是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他 ...

  6. windows7股票的,win8残疾人,安装Han澳大利亚sinoxn个时间,sinox它支持大多数windows软体

    腾讯科技: 正如先前所宣布,微软,10一个月31迄今,Windows 7家庭基础版.家庭高级版和旗舰版盒装版本将不再销售.而微软是不会再OEM制造商授予许可数量的三个版本. windows7股票的.由 ...

  7. Gaea是支持跨平台具有高并发、高性能、高可靠性,并提供异步、多协议、事件驱动的中间层服务框架

    Gaea是支持跨平台具有高并发.高性能.高可靠性,并提供异步.多协议.事件驱动的中间层服务框架 Gaea:58同城开源的中间层服务框架 https://github.com/58code/Gaea 中 ...

  8. [CLR via C#]1.5 本地代码生成器:NGen.exe

    原文:[CLR via C#]1.5 本地代码生成器:NGen.exe 1. NGen.exe工具,可以在一个程序安装到用户计算机时,将IL代码编译成为本地代码.由于代码在安装时已经编译好,所以CLR ...

  9. 在遍历中使用 iterator/reverse_iterator 进行 Erase 的使用方法

    在遍历中使用 iterator/reverse_iterator 进行 Erase 的使用方法 罗朝辉 (http://blog.csdn.net/kesalin/) 本文遵循"署名-非商业 ...

  10. 勾选Create git respository的作用

    在Xcode中创建项目时会弹出Source Control选项,勾选Create git repository选项可以帮助我们对照以前项目中代码中修改的部分,为开发提供方便. 在项目完成到一定程度时, ...