題目鏈接: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;
}