您的位置:首页 > 其它

poj 1054 The Troublesome Frog

2012-07-18 20:19 447 查看
http://poj.org/problem?id=1054

天哪 为什么不超时 受不了啦

直接暴力加优化就可以过呀

枚举两点 找其他合适的点时 控制一下范围

代码及其注释:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>

using namespace std;

const int N=5005;
struct node
{
int x,y;
}mem
;
int l
;//记录x为i是左起位置
int r
;//记录x为i是右起位置
bool cmp(node a,node b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
bool findy(int l,int r,int Y)//二分查找
{
if(l==-1)
return false;
while(l<=r)
{
int mid=(l+r)>>1;
if(mem[mid].y==Y)
return true;
if(Y<mem[mid].y)
{
r=mid-1;
}
else
{
l=mid+1;
}
}
return false;
}
int main()
{
int n,m;
int w;
while(scanf("%d %d",&n,&m)!=EOF)
{
scanf("%d",&w);
for(int i=0;i<w;++i)
{
scanf("%d %d",&mem[i].x,&mem[i].y);
}
sort(mem,mem+w,cmp);
memset(l,-1,sizeof(l));
memset(r,-1,sizeof(r));
for(int i=0;i<w;++i)
{
if(l[mem[i].x]==-1)
{
l[mem[i].x]=i;//左起位置
}
if(i+1==w||mem[i].x!=mem[i+1].x)
{
r[mem[i].x]=i;//右起位置
}
}
int ans=0;
for(int i=0;i<w;++i)
{
for(int j=i+1;j<w;++j)
{
int xtemp=mem[j].x-mem[i].x;
int ytemp=mem[j].y-mem[i].y;
int X=mem[i].x-xtemp;
int Y=mem[i].y-ytemp;
if(X>=1&&Y>=1&&Y<=m)//往回找不越界的话 如果找到合适的点说明已经找过这条线路 找不到则不合适
continue;
X=mem[j].x+xtemp;
Y=mem[j].y+ytemp;
int sum=2;
while(X<=n&&Y>=1&&Y<=m&&findy(l[X],r[X],Y))
{
++sum;
X=X+xtemp;
Y=Y+ytemp;
}
if(X>n||Y<1||Y>m)//必须已经越界
ans=max(ans,sum);
}
}
if(ans<3)
ans=0;
printf("%d\n",ans);
}
return 0;
}


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