设单次攻击次数为s,双击次数为d 则有s+d=k,s+2d=a 即d=a-k
因此对d这个固定值进行分析
如果d>a/2,虚空索敌,-1退出;
如果d<n/2,整个数组每个数至少是1,这种情况下肯定不能把整个数组变成0,-1退出;
构造策略采取控制前两个数,剩余n-2全部赋为1,这
个 1 自身会产生
次双重攻击,剩下
由前两个数构造,直接令第 2 个元素的值等于
,剩下的即位第一个元素。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ui = unsigned;
using ulll = unsigned __int128;
using lll = __int128;
using db = double;
using ldb = long double;
using b20 = bitset<20>;
const int Inf = 0x3f3f3f3f;
const ll Linf = 0x3f3f3f3f3f3f3f3fLL;
const db Dinf = 1e18;
const int Maxm = 400005;
const int Maxn = 10005;
const int MOD[] = {998244353, 1000000007};
#define endl '\n'
//------------------------------------------------------------------
void solve() {
ll n, a, k;
cin >> n >> a >> k;
if (n == 1) {
cout << ((a == k) ? a : -1) << endl;
return;
}
ll d = a - k;
if (d * 2 > a) {
cout << -1 << endl;
return;
} else if (d < n / 2) {
cout << -1 << endl;
return;
} else {
ll x = d - (n - 2) / 2;
ll y = a - x - n + 2;
cout << max(x, y) << ' ' << min(x, y) << ' ';
for (ll i = 0; i < n - 2; ++i) cout << 1 << ' ';
cout << endl;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
solve();
return 0;
}

京公网安备 11010502036488号