題目大意:在一個長走廊裏面搬桌子,走廊的兩側都是房間,把桌子從一個房間搬到另一個房間,走廊的寬度每次只允許搬一個桌子,每次搬桌子需要10分鐘,問最少多長時間辦完。
輸入:第一個數t代表測試用例,接下里是n,表示要搬的桌子的總數,接着n行代表每個桌子從房間i搬到房間j
輸出:最少需要的時間
解題思路:
首先考慮,給出的每次需要搬的房間號,實際情況中是可能從大的房間號往房間號小的房間搬,因此,在讀入數據時刻同時做一個方便接下來的處理的操作,就是保證每次都是從房間號小的朝着大的搬,結果是一樣的(因爲對於佔用走廊的情況是相同的)
另一方面,可以想到通過進行某種處理來標示這段走廊已被佔用,通過累加這種走廊的重疊佔用情況,來得到最大的重疊數。由於1-400個房間是在走廊兩側雙向分佈的,所以房間1和房間2是公用的同一段走廊,因此在累積標識的時候可以採用一個count[205]數組。
代碼如下:
# include <iostream>
# include <algorithm>
using namespace std;
int main()
{
//freopen("input.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
int n,time;
scanf("%d",&n);
int count[205];
memset(count,0,sizeof(count));
int i,j,x,y,s,e;
for(i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
if(x>y)
{
int temp;
temp=x;
x=y;
y=temp;
}
s=(x+1)/2;
e=(y+1)/2;
for(j=s;j<=e;j++)
{
count[j]++;
}
}
int maxc=0;
for(i=1;i<201;i++)
{
if(maxc<count[i])
maxc=count[i];
}
time=maxc*10;
printf("%d\n",time);
}
return 0;
}