问题描述
小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;
}