題目鏈接
http://acm.hdu.edu.cn/showPRoblem.php?pid=1050

題意為:
為了敘述方便,把一個房間里面的桌子移動到另一個房間稱為一個移動,給出若干個要求完成的移動,任意兩個移動僅在移動路線不相交的情況下可以同時進行,求出移動所需花費的最小次數(時間).
注意:
出現有"對門"的路線,不能同時移動,例如,[2,4]和[3,5]不能同時進行,因為3和4對門.
路線重疊:
凡是路線重疊的兩個移動,不能同時進行.路線重疊例如,[1,4]和[2,5]路線重疊,[2,4]和[3,5]路線重疊,[4,2]和[5,3]路線重疊.根據題意,可以看出,移動的順序對于路線是否重疊沒有影響.另外,對門的位置可以看做一個位置.
思路:將每一條移動路線看做一條直線,假設所有的移動同時進行,則會有多個地方出現直線重疊的情況,求出重疊的最大層數(有多少條直線在同一處重疊最多)
C++代碼如下
#include<iostream>#include<algorithm>using namespace std;int main(){ int T; cin >> T;//測試次數 int start,end;//每次移動的起始位置 while(T--) { int n;//每次測試中,移動的個數 cin >> n; int a[200] = {0};//記錄每個位置的重疊的次數,開始都為0. //一共有400個房間,由于對門位置看做一個位置,所以共有200個位置. for(int i=0;i<n;i++)//針對每個移動而言. { cin >> start >> end; start = (start+1)/2; end = (end+1)/2;//這樣處理之后,對門位置變為一個位置.可以把兩個 + 同時改為 - 也正確. int max = std::max(start,end);//為了下面循環而作的處理 int min = std::min(start,end); for(int k=min;k<=max;k++)//看看這個移動為200個位置上的重疊次數的貢獻是多大. a[k] ++; } int max = -1; for(int i=0;i<200;i++)//找出數組a中最大值 { if(a[i]>max) { max = a[i]; } } cout << 10*max << endl; } return 0;}參考:http://www.cnblogs.com/ahu-shu/p/3551829.html
新聞熱點
疑難解答