Emergency Evacuation,题解

题目:

题意:

  在某一秒,每个人可以进行一个移动:去旁边座位,去过道,在过道向出口走,求最少多少秒可以让所有人离开(具体如图和样例)。

分析:

  首先,我们先考虑简单的,只考虑出口前有什么事件发生:1.这一秒有人出出口,2.这一秒没人出出口。

  而如果有人出出口,一定是一个人(注意重音,在第二个一上),所有有人出出口的秒数就是人数,而没人出出口的秒数便是我们要求的秒数。

  怎样才会没人出出口呢?如果过道里一人挤着一人,那必定是每秒都有人出出口,而一但中间有空缺,这一秒就不会有人出出口,所有我们只需算出最后有多少空缺就可以了。

  又怎样会导致中间又空缺呢?出现了接不上的情况:如,A5秒到达了出口,下一个可以到达出口的B却需要8s,中间就不得不空一段时间(2s),好的,那我们只要求得所有这种情况就好了,而如果只有一个人,这个人的最少出去的时间是很容易确定的,只要在输入的时候处理一下就好了,然后呢,排个序(我觉得直接用下标排序就挺好),计算每一个时间过后的最后一个出去的,看看能不能接上这一个就好了。

  最后看代码吧。

#include <cstdio>
#include <cmath>
#include <string>
using namespace std;
const int maxn=2000+10;
int rs[maxn];//记录每个时间出现的次数
int main(){
    int n;
    int r,s,p;
    scanf("%d%d%d",&r,&s,&p);
    int js1,js2;
    for(int i=1;i<=p;i++){
        scanf("%d%d",&js1,&js2);
        rs[max(s-js2+1,js2-s)+r-js1+1]++;//推一下公式
    }
    int ma=0;//最后一个出去的时间
    int ans=0;//已经空的个数
    for(int i=1;i<maxn;i++){
        if(rs[i]){//需要处理
            if(ma>=i-1)//可以接上
                ma=rs[i]+ma;
            else{//接不上
                ans+=i-ma-1;//空出时间
                ma=i-1+rs[i];
            }
        }
    }
    printf("%d",ans+p);
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/wish-all-ac/p/12672665.html