hdu acm-step 1.3.1 Moving Tables
阿新 • • 發佈:2017-08-16
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) { intt = 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