[codeforces 1409C] Yet Another Array Restoration 相邻元素差值尽可能小+向下拓展向上拓展

Codeforces Round #667 (Div. 3)   参与排名人数12482

[codeforces 1409C]   Yet Another Array Restoration   相邻元素差值尽可能小+向下拓展向上拓展

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址http://codeforces.com/contest/1409/problem/C

ProblemLangVerdictTimeMemory
C - Yet Another Array Restoration GNU C++17Accepted31 ms0 KB

题目大意:推导数组元素,有n个大于0的数组元素,若将数组元素自小到大排序,相邻数组元素差值相等,再给出其中的两个元素x,y,要求推导出的数组元素的最大值,尽可能小。

基本思路:根据给出的x,y元素,算出相邻数组间差值,要求差值尽可能小。

部分样例模拟如下:

5 3 8

8 3 13 18 23

3 () ()...... () 8
3,8之间有a个元素,那么就有a+1个差值,假定相邻差值为d。
则有8-3=(a+1)*d,(8-3)/d-1=a
枚举差值d
d=1时,a=4,加上3,8两个元素,总元素数量为4+2=6,超过了限制数量5,此种情况不行。
d=2时,5%2!=0,因5无法整除2,此种情况不行。
d=3时,5%3!=0,因5无法整除3,此种情况不行。
d=4时,5%4!=0,因5无法整除4,此种情况不行。
d=5时,a=0,考虑此种情况:
数组中:
元素1是8,
元素2是8-5=3,
因3-5=-2,元素不能比3小了,只能比8大,
元素3是8+5=13,
元素4是13+5=18,
元素5是18+5=23,

AC代码如下:

#include <stdio.h>
int a[55];
int main(){
	int t,n,x,y,d,m,i,start,b,cnt,z;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d%d",&n,&x,&y);
		d=y-x;
		for(i=1;i<=d;i++)//寻找排序后,相邻两元素间距
			if(d%i==0&&d/i-1+2<=n)break;//详见样例模拟
		cnt=0;
		z=y;
		a[++cnt]=z;
		while(cnt<n){//向下拓展,比y小
			if(z-i<=0)break;
			z-=i;
			a[++cnt]=z;
		}
		z=y;
		while(cnt<n)z+=i,a[++cnt]=z;//向上拓展,比y大
		printf("%d",a[1]);
		for(i=2;i<=n;i++)printf(" %d",a[i]);
		printf("\n");
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值