【贪心】Emergency Evacuation
题目
大致题意
把指定的人从同一出口送出车外,且同一位置不能同时有两个人,求所需的最短时间。
分析
第一感觉就是利用贪心思想解决问题,但是这道题的数据范围用模拟的话肯定是会爆掉的,所以这是不可取的。
我们可以反过来想,把所有人从出口送回原位,然后根据距离进行降序排序,离出口远的人先进,其他人后进,这样就能使时间最小化,得出最优解。
代码
#include <cstdio> #include <iostream> #include <cmath> #include <cstring> #include <algorithm> #include<queue> #include<stack> #include<vector> #include<map> using namespace std; struct per{ int r,c;//原位置 int d;//原位置离出口的距离 }; struct per pe[500005]; bool cmp(struct per a,struct per b){ return a.d>b.d; } int main(){ int r,s,p,i; cin>>r>>s>>p; for(i=0;i<p;i++) { cin>>pe[i].r>>pe[i].c; if(pe[i].c>s) pe[i].d=(pe[i].c-s)+(r-pe[i].r+1); else pe[i].d=(s-pe[i].c+1)+(r-pe[i].r+1); } sort(pe,pe+p,cmp); int k=1;//在队列中等待进入车厢的时间 int maxtime=pe[0].d; for(i=1;i<p;i++){ if(pe[i].d+k>maxtime) maxtime=pe[i].d+k; k++; } cout<<maxtime<<endl; return 0; }
$Never\ Give\ Up$