1409C - Yet Another Array Restoration

该篇博客介绍了如何解决Codeforces上的一道编程题目,涉及等差数列的构造。给定数列长度n和两个数ai、aj,要求构造一个使得所有元素大于0且为等差数列的序列,同时最大化数列中最大值的最小可能值。博主通过分析得出解决方案,当a1小于0时,可以通过调整差值d使得a1变为正,并确保整个数列合法。代码实现中,博主通过寻找合适的差值d和首项a1,实现了这一目标。
摘要由CSDN通过智能技术生成

链接:

https://codeforces.com/problemset/problem/1409/C

题意:

给定了数列长度n,数列中第i,j 位的ai和aj,已经保证i<j且ai<aj(i,j不是给定数)

要求找出符合下列条件:

  1. an(n为如何合法数字)都大于0
  2. 整个数列为等差数列

其中数列内最大值要求尽可能小,即max(a1…an)最小时的数列

输入

5
2 1 49
5 20 50
6 20 50
5 3 8
9 13 22

输出量

1 49 
20 40 30 50 10
26 32 20 38 44 50 
8 23 18 13 3 
1 10 13 4 19 22 25 16 7 

解:

要让等差数列第n个最小,即要让结果靠近aj,如果a1大于0,且d合适,max(an)=aj

a1<0时,max(an)=aj+(合适数量)x*d,x能使a1>0

同时要让d尽可能小,使j和i差距尽可能大

实际代码:

#include<iostream>
using namespace std;
int main()
{
	int T;
	cin>>T;
	for(int f=1;f<=T;f++)
	{
		int n,x,y;
		cin>>n>>x>>y;
		if(n==2) cout<<x<<" "<<y<<endl;
		else
		{
			int temp=y-x;
			int d=0;
			for(int i=n-1;i>=1;i--)
			{
				if(temp%i==0)
				{
					d=temp/i;
					break;
				}
			}
			//cout<<"D"<<d<<endl;
			int a1=y%d;
			if((y/d)>(n-1))
			{
				a1=y-(n-1)*d;
			}
			if(a1==0) a1+=d;
 			for(int i=1;i<=n;i++)
			{
			 	if(i==1) cout<<a1;
			 	else cout<<" "<<a1+(i-1)*d;
			}
			cout<<endl;
		}
	}
}

限制:

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值