题目
题意:给出n层楼,每层m个房间,楼梯和电梯的分布这样的(1,x),(2,x)…,(n,x),1<=x<=m,楼梯c1,电梯c2,电梯的速度为v。给出起始点和终点,问最快的速度。
解法:其实很简单,算出走楼梯和电梯的四种情况,然后取最小值即可,记得同一楼层的情况。
状态不好,写了一堆bug
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1e5+10;
int n,m,c1,c2,v;
int a1[maxn],a2[maxn];
int main()
{
while(~scanf("%d%d%d%d%d",&n,&m,&c1,&c2,&v))
{
memset(a1,0,sizeof(a1));
memset(a2,0,sizeof(a2));
for(int i=0; i<c1; i++)
{
scanf("%d",&a1[i]);
}
for(int j=0; j<c2; j++)
{
scanf("%d",&a2[j]);
}
sort(a1,a1+c1);
sort(a2,a2+c2);
int q;
scanf("%d",&q);
int x1,x2,y1,y2;
for(int i=1; i<=q; i++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1==x2)
{
printf("%d\n",abs(y1-y2));
}
else
{
int ans=inf;
int k;
if(c2)
{
k=lower_bound(a2,a2+c2,y1)-a2;
if(k>=0&&k<c2)
ans=min(ans,(abs(x1-x2)/v+(abs(x1-x2)%v?1:0)+abs(y1-a2[k])+abs(y2-a2[k])));
k--;
if(k>=0&&k<c2)
ans=min(ans,abs(x1-x2)/v+(abs(x1-x2)%v?1:0)+abs(y1-a2[k])+abs(y2-a2[k]));
k=lower_bound(a2,a2+c2,y2)-a2;
if(k>=0&&k<c2)
ans=min(ans,abs(x1-x2)/v+(abs(x1-x2)%v?1:0)+abs(y1-a2[k])+abs(y2-a2[k]));
k--;
if(k>=0&&k<c2)
ans=min(ans,abs(x1-x2)/v+(abs(x1-x2)%v?1:0)+abs(y1-a2[k])+abs(y2-a2[k]));
}
if(c1)
{
k=lower_bound(a1,a1+c1,y1)-a1;
if(k>=0&&k<c1)
ans=min(ans,abs(x1-x2)+abs(y1-a1[k])+abs(y2-a1[k]));//printf(" %d\c1",ans);
k--;
if(k>=0&&k<c1)
ans=min(ans,abs(x1-x2)+abs(y1-a1[k])+abs(y2-a1[k]));
k=lower_bound(a1,a1+c1,y2)-a1;
if(k>=0&&k<c1)
ans=min(ans,abs(x1-x2)+abs(y1-a1[k])+abs(y2-a1[k]));
k--;
if(k>=0&&k<c1)
ans=min(ans,abs(x1-x2)+abs(y1-a1[k])+abs(y2-a1[k]));
}
printf("%d\n",ans);
}
}
}
return 0;
}