题目:样例:
|
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; // 数组acin >> 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;
}