Bootstrap

G-Traffic

这道题是在打训练赛写的,当时是剩下还不到半个小时看的,看了一小会就有思路,但是还是没有在比赛时间做出来,过了得10分钟才调试出来,有一些细节没考虑当时。

题目大意:有两排车要通过一个十字路口,东西排有n辆车,南北排有m辆车,每辆车都会在某一的时间通过十字路口,如果有两辆车在同一时间通过十字路口的话,就会发生交通事故,现在东西排车子按计划行驶,南北的话要等东西排一段时间,让交通事故不发生,问至少停下多少秒,注意是全部一起停下。

思路:要让每一辆车子通过十字路口的时间不同,就要让南北方向的车子等待一段时间,让通过时间不同,可以用一个数组来记录时间路口在第几秒有汽车通过,因为东西方向的车子不变,先记录,再去记录南北方向的车子,从头开始记录,如果时间冲突,等待时间就增加一秒,知道最后一辆车子通过也没有发生交通事故,输出等待时间。

下面是当时的代码,还没来得及整理,AC代码

#include<iostream>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<cstring>
#include<set>
#include<vector>
#include<stack>
//#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int T = 1;
int n, m;
void slove() {

int a[1005] = { 0 }; int b[1005] = { 0 }, rood[2010] = { 0 };//分别是东西,南北方向的车子通过时间的数组,还有记录某一时刻是否有车子通过的数组
        for (int i = 0; i < n; i++)cin >> a[i];//东西方向通过时间

        for (int j = 0; j < m; j++)cin >> b[j];//南北方向通过时间

        for (int i = 0; i <= 100000; i++) {//等待时间从0,到100000,这是随便取的,反正不可能等这么久吧
            memset(rood, 0, sizeof(rood));//重置数组
            for (int j = 0; j < n; j++) rood[a[j]]++;//东西方向车子先占用可以通过十字路口的时间
            for (int j = 0; j < m; j++) {
                rood[b[j] + i]++;
                if (rood[b[j] + i] >= 2) {//冲突,重新判断,+i就是等待的秒数
                    break;
                }
                if (j==m-1&&rood[b[m - 1] + i] == 1) {//坚持到最后的车子通过
                    cout << i << endl;
                    return;
                }
            }
        }
    }

int main() {

    //scanf("%d", &T);
    while (~scanf("%d%d", &n, &m)) {
        slove();
    }
    return 0;

}

;