blucode-小M的书柜设计

50 阅读2分钟

问题描述

小M终于拥有了属于自己的房子,并打算好好设计书房。他有很多珍藏的书籍,这些书按照时间顺序保存着。现在,他希望在书柜的每个格子里,书籍的高度差异不超过一个特定值 k,并且书籍的排列要满足时间上的连续性(即书籍在格子内的序号要连续)。同时,书柜的每个格子能容纳的书越多越好。

你的任务是帮助小M计算出在同一个格子里最多能放多少本书,以及有多少种放置方式可以达到这个要求,并且列出每种放置方式中书籍的最小和最大序号。

返回的列表中,第一行的第一个元素是最大的书的数量,第二个元素是放置方式数量m,此后m个列表分别表示书籍的最小和最大序号。


测试样例

样例1:

输入:n = 3, k = 3, array = [14, 12, 10]
输出:[[2, 2], [1, 2], [2, 3]]

样例2:

输入:n = 2, k = 0, array = [10, 10]
输出:[[2, 1], [1, 2]]

样例3:

输入:n = 4, k = 5, array = [8, 19, 10, 13]
输出:[[2, 1], [3, 4]]


#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

vector<vector<int>> solution(int n, int k, vector<int> array) {
  int max_len = 0;
  vector<vector<int>> result;

  for (int l = n; l >= 1; --l) {
    bool found = false;
    vector<vector<int>> temp;

    for (int i = 0; i <= n - l; ++i) {
      int j = i + l - 1;
      int current_max = *max_element(array.begin() + i, array.begin() + j + 1);
      int current_min = *min_element(array.begin() + i, array.begin() + j + 1);

      if (current_max - current_min <= k) {
        temp.push_back({i + 1, j + 1});
        found = true;
      }
    }

    if (found) {
      max_len = l;
      result = temp;
      break;
    }
  }

  vector<vector<int>> output;
  output.push_back({max_len, static_cast<int>(result.size())});
  output.insert(output.end(), result.begin(), result.end());
  return output;
}

int main() {
  // Add your test cases here

  cout << (solution(3, 3, {14, 12, 10}) ==
           vector<vector<int>>{{2, 2}, {1, 2}, {2, 3}})
       << endl;
  cout << (solution(2, 0, {10, 10}) == vector<vector<int>>{{2, 1}, {1, 2}})
       << endl;
  cout << (solution(4, 5, {8, 19, 10, 13}) ==
           vector<vector<int>>{{2, 1}, {3, 4}})
       << endl;

  return 0;
}