POJ 1083 Moving Tables

这个题目可能过于水了。也记记吧。题目链接

题目大意:老板要布置400个房间,要搬桌子,房间的分布如下:

1083_1

要从一个房间搬到另一个房间,走廊里面只能一次搬一张桌子,当占用某部分走廊时候,其他要过这个走廊的桌子就不能搬。每搬一张桌子花费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: }
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页