A. Increasing and Decreasing

文章讨论了一个关于数列的问题,给定起始值x、结束值y和项数n,判断是否能构造一个递减的等差数列。如果可用数字小于等差之和,输出-1,否则构建并输出数列。

题目:样例:

输入
3
1 4 3
1 3 3
100 200 4

输出
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;
}

最后提交:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值