构造题,本题找规律,首先能发现,a的长度能决定最后数组的长度n = a + 2
且当b, c 有一个大于a时, 都判断为-1
接下来就是纯粹的构造
引入dp 思想
先把b, c中大的构造掉 直到目前的数组中b == c
如下代码清晰的注释写出了四种构造时候的情况
数据量较小,直接慢慢判即可
#include <bits/stdc++.h>
#include <vector>
using namespace std;
using i64 = long long;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
i64 a, b, c;
cin >> a >> b >> c;
i64 n = a + 2; //数组的长度
if(b > a || c > a) { //若两个别的数大于a,直接判断-1
cout << - 1;
return 0;
}
vector<i64> ans(n);
ans[0] = 1;
ans[1] = 1; //构造数组 数组的前两项设为1
for(int i = 2; i < n; i++) { //从第三个项开始判断,先判断多的那一份,构造只符合这一项的,若相等后再构造二者都能适用的
i64 temp = 1; // 用来判断此时构造的数据符不符合
i64 sum = temp + ans[i - 1] + ans[i - 2];
if(b > c) {
while (!(sum % 2 == 0 && sum % 3 != 0)) {
temp++;
sum++;
}
ans[i] = temp;
b--;
continue;
} // 先处理b > c 的情况
else if(c > b) {
while (!(sum % 3 == 0 && sum % 2 != 0)) {
temp++;
sum++;
}
ans[i] = temp;
c--;
continue;
} // 处理b < c 的情况
else if(c == b && c != 0 && b != 0) {
while (!(sum % 3 == 0 && sum % 2 == 0)) {
temp++;
sum++;
}
ans[i] = temp;
b--;
c--;
continue;
} // b == c && b, c != 0;
else if(c == b && c == 0 && b == 0) {
while (!(sum % 3 != 0 && sum % 2 != 0)) {
temp++;
sum++;
}
ans[i] = temp;
continue;
} // b == c && b, c != 0;
}
cout << n << endl;
for(auto &i:ans) {
cout << i << ' ';
}
}

京公网安备 11010502036488号