• 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;
    } 
  • 相关阅读:
    Mastering Web Application Development with AngularJS 读书笔记-前记
    通过信息系统项目管理师-我的备考经验
    通过系统集成项目管理工程师考试-我的备考分享
    即将翻译 Building The New Financial Times Web App
    CSS3:flex布局应用
    前端性能利器——dynatrace ajax edition
    SIMD---AVX系列
    DirectSound---捕获音频、Qml/C++ 集成交互
    SIMD---SSE系列及效率对比
    SIMD---MMX代码优化
  • 原文地址:https://www.cnblogs.com/wish-all-ac/p/12672665.html
Copyright © 2020-2023  润新知