1. 程式人生 > >hdu acm-step 1.3.1 Moving Tables

hdu acm-step 1.3.1 Moving Tables

col alt 最短 can spa http 執行 現在 printf

技術分享技術分享

          本題題意是:有一個走廊以及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