题目:样例:
|
1 3 4 -1 100 150 180 200 |
思路:
思维题,这里我们看一下规律,我们已知a(1),a(n) ,又因为 数列b 应该是递减的,而观察规律可知 ,数列b递减过程中,等差累加, 所以当我们 a(1) 到 a(n) 之间可用的数字如果小于 这些等差之和的话,一定没有满足的数组a,特判直接输出 -1.
最后,模拟构造一遍数组,输出即可。
代码详解如下:
#include <iostream>
#include <unordered_map>
#define endl '\n'
#define YES puts("YES")
#define NO puts("NO")
#define umap unordered_map
#pragma GCC optimize(3,"Ofast","inline")
#define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;
int x,y,n;
inline void solve()
{
umap<int,int>a; // 数组a
cin >> x >> y >> n;
// 我们 a(1) 到 a(n) 之间可用的数字如果小于
// 这些等差之和的话,一定没有满足的数组a,特判直接输出 -1.
if(y - x < (n - 1) * n / 2)
{
puts("-1");
return;
}
a[1] = x,a[n] = y;
int cnt = 1; // b 数组的等差
// 根据 b 数组,从后往前遍历构造
for(int i = n - 1;i >= 2;++cnt,--i)
{
// 减去等差
a[i] = a[i + 1] - cnt;
}
// 输出数组
for(int i = 1;i <= n;++i)
{
cout << a[i] << ' ';
}
cout << endl;
}
int main()
{
// freopen("a.txt", "r", stdin);
// ___G;
int _t = 1;
cin >> _t;
while (_t--)
{
solve();
}
return 0;
}