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; }
相关文章推荐
- hdu 2390 Olympic Games【贪心】
- 贪心二分
- UVA 714 Copying Books 最大值最小化问题 (贪心 + 二分)
- codeforce 3B. Lorry(贪心)
- [POJ 2376] Cleaning Shifts (区间贪心)
- GYM-100796C-Minimax Tree【贪心】
- UVA 311 Packets(贪心 + 模拟)
- poj 3614 抹防晒霜的牛(贪心 + 优先队列)
- Hdu 3552 I can do it!(贪心)
- CF - 797C. Minimal string - 贪心+栈处理+字符串处理
- UVA 10602 Editor Nottoobad(贪心)
- 四、贪心
- UVa 11134 Fabled Rooks (贪心+问题分解)
- 二分贪心-X
- POj 3601 Tower of Hanoi 汉诺塔(贪心)
- hdu 1969 Pie(贪心+二分查找)(简单)
- 福建第六届省赛 H 贪心 哈夫曼思想
- UVA 120 Stacks of Flapjacks (模拟+贪心)
- 贪心算法专题总结
- uva 311 Packets(贪心)