HDOJ 1050 Moving Tables(貪心&&靈活)

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

題目大意:從房間i移到到房間j,在移動過程中,走廊i-j這一個部分被佔用。只要不共用走廊的移動都可同時進行,每移動一次需要10分鐘。

題目分析:

1.注意房間構造,奇數房間在上面,偶數房間在下面,但是相對的房間佔用同一個走廊。所以我們把房間都轉換爲同一邊。

room=(room+1)/2;  //房間號處理,變爲1-200

2.輸入要求說明,每個房間只會出現一次;

3.輸入情況可能出現房間號大小順序問題,所以爲方便,我們進行處理,將小的房間號放前面;

4.區間貪心要多次進行,因爲每次我們只是把一種情況可同時搬運的計算出來,可能還有另外幾種情況;

思路一:區間貪心

struct Room{
	int s,t;
	bool flag;
}r[205];
bool cmp(Room r1,Room r2){
    return r1.t<r2.t;    //必須採用開始房間號小排序,使用結束房間號排序會出錯
}
void swap(int &a,int &b){
	int temp=a;
	a=b;
	b=temp;
}
int main(){
	int N;
	cin>>N;
	while(N--){
		int count=0;
		int n;
		cin>>n;
		for(int i=0;i<n;i++){
			cin>>r[i].s>>r[i].t;
			r[i].flag=true;
			if(r[i].s>r[i].t)    //房間號大小順序處理
				swap(r[i].s,r[i].t);
	        //房間號處理
			r[i].s=(r[i].s+1)/2;
			r[i].t=(r[i].t+1)/2;
		}
		sort(r,r+n,cmp);    //排序
		int jl;
		int k=0;
		while(k<n){        //要循環進行
			jl=0;
			for(int i=0;i<n;i++){
				if(r[i].flag&&r[i].s>jl){
					k++;
					jl=r[i].t;
					r[i].flag=false;
				}
			}
			count++; 
		}
		cout<<count*10<<endl;
	}
	return 0;
}

要按開始房間號從小到大排序,而不是結束房間號。

1
4
2 10
4 6
8 16
12 14

思路二,對走廊進行分析,計算走廊被重複利用次數。

void swap(int &a,int &b){
    int temp=a;
    a=b;
    b=temp;
}
int main(){
    int N;
    cin>>N;
    while(N--){
        int corridor[205]={0,};
        int n;
        cin>>n;
        for(int i=0;i<n;i++){
            int a,b;
            cin>>a>>b;
            if(a>b)
                swap(a,b);
            a=(a+1)/2;
            b=(b+1)/2;
            for(int j=a;j<=b;j++){
                corridor[j]++;
            }
        }
        sort(corridor+1,corridor+201);    //從小到大排序,最後一個是走廊被重複利用的最多次數
        cout<<corridor[200]*10<<endl;
    }
    return 0;
} 
 

 

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