1. 程式人生 > >HDOJ-1050-Moving Tables(nyoj220)

HDOJ-1050-Moving Tables(nyoj220)

sam man 進行 最大 初始 move isp algo image

推桌子

時間限制:1000 ms | 內存限制:65535 KB 難度:3
描述
The famous ACM (Advanced Computer Maker) Company has rented a floor of a building whose shape is in the following figure.
技術分享

The floor has 200 rooms each on the north side and south side along the corridor. Recently the Company made a plan to reform its system. The reform includes moving a lot of tables between rooms. Because the corridor is narrow and all the tables are big, only one table can pass through the corridor. Some plan is needed to make the moving efficient. The manager figured out the following plan: Moving a table from a room to another room can be done within 10 minutes. When moving a table from room i to room j, the part of the corridor between the front of room i and the front of room j is used. So, during each 10 minutes, several moving between two rooms not sharing the same part of the corridor will be done simultaneously. To make it clear the manager illustrated the possible cases and impossible cases of simultaneous moving.
技術分享

For each room, at most one table will be either moved in or moved out. Now, the manager seeks out a method to minimize the time to move all the tables. Your job is to write a program to solve the manager‘s problem.
輸入
The input consists of T test cases. The number of test cases ) (T is given in the first line of the input file. Each test case begins with a line containing an integer N , 1 <= N <= 200, that represents the number of tables to move.
Each of the following N lines contains two positive integers s and t, representing that a table is to move from room number s to room number t each room number appears at most once in the N lines). From the 3 + N -rd
line, the remaining test cases are listed in the same manner as above.
輸出
The output should contain the minimum time in minutes to complete the moving, one per line.
樣例輸入
3 
4 
10 20 
30 40 
50 60 
70 80 
2 
1 3 
2 200 
3 
10 100 
20 80 
30 50
樣例輸出
10
20
30
上傳者
苗棟棟

#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int num[300]={0};//初始化數組。一共400個房間,簡化後為200個,所以定義300大小,沒問題;
int s,e,t,n;
while(~scanf("%d",&n))
{
for(int i = 0;i<n;i++)
{
scanf("%d%d",&s,&e);
s = (s+1)/2; //可以看為將對面兩個房間的房間號變為一樣,將房間數簡化為200個,且在一條直線上,看做區間覆蓋問題。
e = (e+1)/2;
if(s>e)//不論是從小房間號到大房間號,還是從大房間號到小房間號,都化為一條直線上從小到大的排序,便於標記計算。
swap(s,e);//交換大小
for(int j = s;s<=e;j++)//重點來了,之前初始化數組為0,現在對每一組輸入進行標記,比如從15-16,其實s=8,e=8,標記在一條線段上為8處+1,以此類推,若第二組經過8,則8處再+1;
num[j]++;
}
int ans = 0;//初始比較數,設為0,沒有經過的房間數在數組中值都為0,經過以此即為1,以此類推;
for(int i = 0;i<200;i++)
{
if(num[i]>ans)
ans = num[i];//循環遍歷整個200大小的數組,找出數組中的最大值,即為推桌子活動中重疊的次數;
}
printf("%d\n",ans*10);
}
return 0;
}

終於弄懂了,入門艱難,且行且珍惜,加油!!

HDOJ-1050-Moving Tables(nyoj220)