Moving Tables

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.

這裏寫圖片描述
Table moving
Reason
Possible
( room 30 to room 50) and (room 60 to room 90)
no part of corridor is shared
(room 11 to room 12) and (room 14 to room 13)
no part of corridor is shared
Impossible
(room 20 to room 40) and (room 31 to room 80)
corridor in front of room 31 to room 40 is shared
(room 1 to room 4) and (room 3 to room 6)
corridor in front of room 3 is shared
(room 2 to room 8) and (room 7 to room 10)
corridor in front of room 7 is shared

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 N+3-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

題目不難,英文有些難以理解。
題目意思就是從兩個不同的房間移桌子,移動桌子需要佔用房間之間的過道,佔用一次需要10分鐘,問至少需要多少時間。
以最後一次輸入爲例
用數組a[200]初始化爲0
3
10 100 經過 5-50過道 這過道的值都+1
20 80 經過 10-80過道

這過道的值都+1
30 50

經過 15-25過道 這過道的值都+1
掃一遍 尋找 a[200]中的最大值 發現 15-25 這10個數都是3 最大 即 15-25這個過道必須得被佔用3次
用 3*10(time)就可得出正確結論

#include<stdio.h>
int main()
{
    int x,s,n,t,i,temp;
    scanf("%d",&x);
    while(x--)
    {
        int ans[300]={0};
        //memset(ans,0,sizeof(ans));另一種初始化數組值爲0的方法
        scanf("%d",&n);
        while(n--)
        {
            scanf("%d %d",&s,&t);
            if(s>t)
            {
                temp=t;t=s;s=temp;
            }
            for(i=(s+1)/2;i<=(t+1)/2;i++)
            {
                ans[i]++;
            }
        }
        int max=0;
        for(i=1;i<=200;i++)
        {
            if(max<ans[i])
            {
                max=ans[i];
            }
        }
        printf("%d\n",max*10);
    }
} 

memset(a,0,sizeof(a))意思就是將a數組所有值初始爲0;
這裏初始值只能是0或-1;
因爲memset是對每個字節賦值,而int有4字節(32位)
比如這樣,memset(a,1,sizeof(a));
則a中的每個元素都被賦值成爲2進制數爲00000001000000010000000100000001的數
轉換成10進制就是16843009
所以,一般用memset對數組賦0或-1,賦其他的值就要用循環來實現。
用int a[10]={0};也可以初始化所有值爲0;
int a[10]={10};意思爲a[0]的值爲10,其他值爲0;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章