G-Traffic模拟(小心数组大小)

这道题数组开小了会WA,建议开3e3+10;

题目G

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以内)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值