您的位置:首页 > 其它

C.Emergency Evacuation(贪心)

2019-03-29 15:23 12 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_40534166/article/details/88894175

ICPC — International Collegiate Programming Contest
Asia Regional Contest, Yokohama, 2018–12–09

C.Emergency Evacuation(贪心)

原题:

题意:把指定的人从同一出口送出车外,且同一位置不能同时有两个人,求所需的最短时间。

当时第一眼感觉是贪心,但是从把所有人都推出的角度考虑感觉不好找到贪心策略,模拟又不现实,肯定会炸。。。

解题方法:
逆向思维,考虑将所有人从出口处送回原位置,并且依据各自原位置到出口的距离进行排序,将距离较远的排在前面,可以理解为原位置离出口较远的人先进入,而原位置离出口较近的人后进入,这样可以让花费的时间达到最小,从而得到最优解。

#include<bits/stdc++.h>
#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<map>
using namespace std;
#define scan(n) scanf("%d",&n)

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: