这个题目可能过于水了。也记记吧。题目链接
题目大意:老板要布置400个房间,要搬桌子,房间的分布如下:
要从一个房间搬到另一个房间,走廊里面只能一次搬一张桌子,当占用某部分走廊时候,其他要过这个走廊的桌子就不能搬。每搬一张桌子花费10分钟,然后给一堆数据,最短花费多长时间。
假设从1->399(或者2->400)的走廊是一条线段,每搬一张桌子(如从30号房间搬到40号房间),则线段30->40被重复了一次。如果另外再搬一张桌子(如从35号房间搬到45号房间),则线段35->45被重复了一次。而相同的线段35->40则被重复了两次。问题转化为求最大重复次数。
那很好办了,一个201大小的数组表示走廊位置,初始化为0. 若30->40重复(30号房间搬桌子到40号房间),则对30,31,32……40号房间对应的走廊位置上都加1,第二次35->45,又对35->45号房间对应的走廊位置加1。全部完成后,找出走廊最大值的位置,乘以10分钟,则是所用时间。
我的代码如下:
1: #include <iostream>
2: using namespace std;
3: const int CORRIDOR_LEN = 201;
4:
5: void initArr(int arr[], const int size)
6: {
7: for (int i=0; i<size; i++)
8: arr[i] = 0;
9: }
10:
11: int main()
12: {
13: int corridor[CORRIDOR_LEN] = {0};
14: int cases=0;
15: cin >> cases;
16: while(cases--)
17: {
18: int n=0;
19: cin >> n;
20: initArr(corridor, CORRIDOR_LEN);
21: for (int i=0; i<n; i++)
22: {
23: int from=0, to=0, min=0, max=0;
24: cin >> from >> to;
25: min = (from+1)/2;
26: max = (to+1)/2;
27: if (min>max)
28: {
29: int temp = min;
30: min = max;
31: max = temp;
32: }
33: for (int j=min; j<=max; j++)
34: {
35: corridor[j]++;
36: }
37: }
38: int maxTime = 0;
39: for (int i=1; i<CORRIDOR_LEN; i++)
40: {
41: maxTime = maxTime<corridor[i] ? corridor[i] : maxTime;
42: }
43: cout << maxTime*10 << endl;
44: }
45: return 0;
46: }