HDU 1050
程序员文章站
2024-03-17 08:43:28
...
解题思路
根据题目中的描述 ,当我们移动多个桌子时,若两次移动的开始房间号和结束房间号没有重合处,即可以同时移动。若有一段走廊有m个桌子都要经过,一次只能经过一个桌子,则需要m*10的时间移动桌子。
所以我们可以设一个数组,下标值即为房间号。桌子经过房间时,该房间号为下标对应的数组值即加10。最后找到最大的数组值,即为移动完桌子需要的最短时间。
想法:
1. 若出发的房间号小于到达的房间号,我们就正常移动,否则需要交换一下,也看成是从房间号小的房间移动到大的房间;
2. 出发房间为偶数则减一,结束房间为奇数则加一
AC代码
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <string.h>
using namespace std;
int main(){
int T,N;
int s_r,e_r;
cin>>T;
while(T--){
int c[1000];
memset(c,0,sizeof(c));
cin>>N;
while(N--){
cin>>s_r>>e_r;
if(s_r>e_r)
swap(s_r,e_r);
if(s_r%2==0)
s_r-=1;
if(e_r%2==1)
e_r+=1;
for(int i=s_r;i<e_r;i++){
c[i]+=10;
}
}
cout<<*std::max_element(c,c+1000)<<endl;
}
return 0;
}
/*
3
4
10 20
30 40
50 60
70 80
2
1 3
2 200
3
10 100
20 80
30 50
Sample Output
10
20
30
*/
运行结果:
代码中用道德两个C++的内置函数
SWAP
max_element