题目:
题意:
在某一秒,每个人可以进行一个移动:去旁边座位,去过道,在过道向出口走,求最少多少秒可以让所有人离开(具体如图和样例)。
分析:
首先,我们先考虑简单的,只考虑出口前有什么事件发生: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; }