标签:blog 最短时间 for循环 png amp 技术分享 using .com class
本题题意是:有一个走廊以及200组互相对着的房间,现在要在不同的房间之间送信,但走廊一次只能通过一个人,因此一旦两个人的路线有重复的部分,那么
就只能分两批走,送一次信要10分钟,现在给出n个人送信的路线,求他们所花的最少时间。
代码如下:
#include <cstdio> using namespace std; int main() { int T; scanf("%d",&T); while(T--) { int a[201] = {0}; int n; scanf("%d",&n); int l,r; for(int i=0;i<n;i++) { scanf("%d%d",&l,&r); l = (l + 1) / 2; r = (r + 1) / 2; if(l > r) { int t = l; l = r; r = t; } for(int i=l;i<=r;i++) { a[i]++; } } int max = 0; for(int i=1;i<=200;i++) max = max > a[i] ? max : a[i]; printf("%d\n",max*10); } return 0; }
其实仔细想想就会发现每两个相对的房间可以划分为1个区域,这样400个房间就能划分为200个区域。
然后再分析路线相交的情况有三种:"完全不相交,部分相交,重合"。
又发现三个人如果不是三人的路线都有重合,那么它们的时间是20。
仔细推理就可以发现只需要求每个人房间经过的人数,然后取其中最大值便是最短时间,因为总有m个人通过该房间,无论怎么调度,这m次是无法避免的。
我们只需要用数组模拟房间经过的人数,然后取最大值,便得到了结果。
需要注意的是,大编号房间到小编号房间时,注意交换两者的序号,否则for循环不会执行(TAT,之前还以为自己写错了,但怎么看逻辑都是对的)。
hdu acm-step 1.3.1 Moving Tables
标签:blog 最短时间 for循环 png amp 技术分享 using .com class
原文地址:http://www.cnblogs.com/mtl6906/p/7375204.html