您的位置:首页 > 其它

CROC-MBTU 2012, Final Round (Online version, Div. 2)笔记

2012-11-28 20:52 323 查看
感觉这次的题目几乎没有算法,都是实现有点烦的题目,代码能力还有待提高.

D. Building Bridge

题意:

  一个平面上有4个点A,B,C,D,A点坐标确定为(0,0),B点坐标为(a,y1),C点坐标为(B,y2),C到D点的距离确定为L,求选取哪个y1和y2的组合可以使总距离最小.

赛时想法:

  当时的情况是C题写的有点慢了,D题剩下40分钟不到,不管是不是心急吧,反正图画出来以后没有什么明确的想法...看着10W的M和N,大脑处于基本空白的状态...坚持到还有20分钟的时候就暂时放弃了...想着就算有了思路也不一定有时间实现了,然后去看别人前面的代码,想要hack赚点分...不过hack还是风险太大了,这次才知道在比赛中看别人的代码是不能复制的,所以样例也没法测试,最后也没有hack,所以总结起来就是最后的时间是被我浪费掉了.

正确思路:

  结束以后抱着强烈的好奇心就去看别人的解法了...看完第一个人的就傻了...比赛的时候一直想着,由于L是不确定的,所以不能直接算...可是完全没有往枚举y2的方向去想,恍然大悟了...其实就是枚举y2的坐标,然后三分确定y1的坐标.

代码1:

View Code

#include<stdio.h>
char map[110][10010];

int main()
{
int n,m,dir,pos,l,r,i,c;
__int64 ans;
scanf("%d%d",&n,&m);
ans=0;
for(i=1;i<=n;i++)
{
scanf("%s",map[i]+1);
map[i][0]=map[i][m+1]='#';
}
dir=1,pos=1;//记录方向,dir=1代表向右,dir=0代表向左,pos代表当前的位置
for(i=1;i<n;i++)
{
c=0;
l=r=pos;//左右边界一开始等于出发点,然后分别向左右拓展开
while(1)
{
if(dir)
{
while(map[i][r+1]=='.'&&map[i+1][r]!='.')
r++;
ans+=r-pos+1;
pos=r;
if(map[i+1][r]=='.')
{
break;
}
else if(map[i][r+1]=='+')
{
map[i][r+1]='.';
dir=!dir;
c=0;//如果是石头墙,则上次碰到混凝土墙的标记应取消
}
else if(!c&&map[i][r+1]=='#')
{
c=1;//如果碰到混凝土墙则标记
dir=!dir;
}
else
{
printf("Never\n");//碰到2次混凝土墙还没有跳出,说明不可能出去了.
return 0;//由于CF是分组测试,可以直接retun跳出,免去不必要的标记.
}
}
else
{
while(map[i][l-1]=='.'&&map[i+1][l]!='.')
l--;
ans+=pos-l+1;
pos=l;
if(map[i+1][l]=='.')
{
break;
}
else if(map[i][l-1]=='+')
{
map[i][l-1]='.';
dir=!dir;
c=0;
}
else if(!c&&map[i][l-1]=='#')
{
c=1;
dir=!dir;
}
else
{
printf("Never\n");
return 0;
}
}
}
}
printf("%I64d\n",ans);
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: