这道题数组开小了会WA,建议开3e3+10;
题目
Sample Input
1 1
1
1
1 2
2
1 3
Sample Output
1
0
思想与解释
这道题告诉你东西南北两个垂直的道路上,有两列单向行驶的车流(比如东向西,北向南),给你东西方向的车子数量n,南北车子的数量n,下面两行分别是n个数据和m个数据,标记着a[i]和b[i]时刻有车子。
而且南北车子必须让着东西方向的车子(也就是说如果出现东西方向1时刻有车,南北方向1时刻也有车,那么东西先开,南北方向的等待一分钟),题目问的就是两个方向的车子全部通过路口需要等待的总时间。
我们来思考一下,什么时候两个方向的车子都可以通过呢?也就是南北车子可以顺利通过,不受到东西方向车子的限制(可以理解成不被堵住),那么总是存在某个时刻,使得b所有的车子都能顺利通过,输出此时的等待的时间。
AC代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pre(i,a,b) for(int i=a;i>=b;--i)
#define debug(a) cout << " " << a << " " << endl
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define m(x) memset(x,0,sizeof x)
//i可能会会比较大,所以数组开大一点
const int maxn = 2010;
int a[maxn],b[maxn];
int main(){
int n,m;
while(~scanf("%d%d",&n,&m))
{
m(a);
m(b);
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
a[x] = 1;
}
for(int i=0;i<m;++i)scanf("%d",&b[i]);
int i = 0;
//时间暴力遍历,总会有一个等待时间使得所有南北方向的车子等待恰当的时间并且不和东西方向的车子撞车
while(1)
{
int flag = 0;
for(int j=0;j<m;j++)
//b[j]+i表示前面等的时间加上b[j]时刻的时间这个时刻是否有东西方向的车,如果有的话说明仍然不成立
if(a[b[j]+i]==1){flag=1;break;}
if(!flag)break;
i++;
}
printf("%d\n",i);
}
return 0;
}
这里需要注意的是数组需要开多大的情况。我们考虑一个极端情况,如果n=m=1000,且a为1-1000,b与a相同。则此时说明南北方向每辆车都得等a全部开过才能正常通过,那么a数组就至少得开2e3+10。(实测铤而走险开2e3也能过,看来数据就是去了1e3以内)