bluecode-小M的幸运数列变换

43 阅读1分钟

问题描述

小M拥有一个长度为n的数组 a,由于他非常喜欢数字 w,他希望将所有数组中的数都变为 w

小M每次操作可以选择一个区间 [l, r],并将该区间内的所有数字都加 1(包括左右边界 l 和 r)。但为了让挑战更具趣味性,小M要求每次操作的l均不相同,r也均不相同。

小M现在想知道,有多少种不同的操作方案可以让数组中的所有数都变为 w。注意,如果所有操作的区间相同,则视为同一种操作方式,操作顺序不同并不会形成新的方案。


测试样例

样例1:

输入:n = 2 ,w = 2 ,array = [1, 1]
输出:2

样例2:

输入:n = 1 ,w = 1 ,array = [1]
输出:1

样例3:

输入:n = 3 ,w = 5 ,array = [5, 4, 5]
输出:1


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

using namespace std;

// Edit your code here
int solution(int n, int w, const std::vector<int> &array) {
  vector<int> d(n);
  for (int i = 0; i < n; ++i) {
    d[i] = w - array[i];
    if (d[i] < 0) {
      return 0;
    }
  }

  bool all_zero = true;
  for (int x : d) {
    if (x != 0) {
      all_zero = false;
      break;
    }
  }

  if (all_zero)
    return 1;

  vector<int> ones;
  for (int i = 0; i < n; ++i) {
    if (d[i] == 1) {
      ones.push_back(i);
    }
  }

  bool all_zero_or_one = true;
  for (int x : d) {
    if (x != 0 && x != 1) {
      all_zero_or_one = false;
      break;
    }
  }

  bool consecutive_ones = true;
  if (!ones.empty()) {
    int min_one = *min_element(ones.begin(), ones.end());
    int max_one = *max_element(ones.begin(), ones.end());
    if (max_one - min_one + 1 != ones.size()) {
      consecutive_ones = false;
    }
  }

  if (all_zero_or_one && consecutive_ones) {
    return ones.size();
  } else {
    return 0;
  }
}

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

  std::cout << (solution(2, 2, std::vector<int>{1, 1}) == 2) << std::endl;
  std::cout << (solution(3, 3, std::vector<int>{1, 2, 3}) == 0) << std::endl;

  return 0;
}