Moving Tables(貪心演算法)

lsy同學發表於2020-11-21

題目描述
著名的ACM公司租用了一幢樓的一層,其形狀如下。在這裡插入圖片描述
整個樓層在走廊的北面和南面各有300個房間。最近公司制定了一個改變佈局的方案,包括在不同房間之間移動許多桌子。由於走廊狹窄,而且桌子都很大,只有一張桌子可以穿過走廊。為了提高工作效率,經理制定瞭如下方案:把一張桌子從一個房間搬到另一個房間可以在5分鐘內完成。當移動一張桌子從I房間搬到J房間時,房間I前面和房間J前面的走廊部分被使用了。因此,在每5分鐘,在不共用走廊的情況下,不同的移動方案可以同時進行。為了說明問題,經理舉例說明了可能發生的情況和不可能同時發生的情況。
在這裡插入圖片描述
對於每個房間,最多一張桌子要麼搬進去,要麼搬出去。現在,經理要計算移動給定的桌子所需的最短時間。你的工作是寫一個程式來解決經理的問題。

輸入
輸入包括T組測試用例,測試用例的數量M在輸入的第一行中給出。每組測試用例的第一行是一個整數N(1<=N<=200),N表示要移動桌子的數量,緊接著是N行,每行包括2個正整數S和T,分別代表一張桌子從S房間移動到T房間(一個房間的序號,在一組測試用例中最多出現一次)。從第N+3行開始,列出了剩餘的測試用例,格式和第一個測試用例相同。

輸出
輸出移動N個桌子所需要的最短時間,每個測試用例結果佔一行。

樣例輸入
3 
4 
10 20 
30 40 
50 60 
70 80 
2 
1 3 
2 200 
3 
10 100 
20 80 
30 50
樣例輸出
5
10
15
#include<bits/stdc++.h>
using namespace std;
int book[601];

struct node{
	int b,e;
};

int main()
{	
	int T,M;
	cin>>T;
	while(T--)
	{	
		int maxn=-999,maxt=-999;
		memset(book,0,sizeof(book));
		cin>>M;
		node a[M];
		for(int i=0;i<M;i++)
		{	
			cin>>a[i].b>>a[i].e;
			if(a[i].b>a[i].e)
			swap(a[i].b,a[i].e);
			maxt=max(maxt,a[i].e);	
		}
		for(int i=0;i<M;i++)
		{	
			for(int j=a[i].b;j<=a[i].e;j++)
			{
				book[j]+=5;
			}
		}
		for(int i=0;i<=maxt;i++)
		{
			if(book[i]!=0)
			{
				maxn=max(maxn,book[i]);
			}
		}
		cout<<maxn<<endl;
	}
	return 0;
} 

相關文章