推导数组元素,有n个大于0的数组元素,若将数组元素自小到大排序,相邻数组元素差值相等,再给出其中的两个元素x,y,要求推导出的数组元素的最大值,尽可能小。
输出可以是乱序的,并且数组中元素大于0,包括x和y
Input
5 2 1 49 5 20 50 6 20 50 5 3 8 9 13 22
Output
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
解题思路:
/*
看题面就知道要这构造一个等差数列
例如 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,
*/
/* 看题面就知道要这构造一个等差数列 例如 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, */ #include<iostream> #include<algorithm> using namespace std; const int maxn=1e5+10; int a[maxn]; int main(){ int t,x,y,d,n; cin>>t; while(t--){ scanf("%d%d%d",&n,&x,&y); int d=y-x; int p;//相邻的差值 for(int i=1;i<=d;i++){ if(d%i==0&&d/i-1+2<=n){ p=i; break; } } int cnt=0; a[++cnt]=y; int pos=y; while(cnt<n){ if(pos-p<=0){ break; } pos-=p; a[++cnt]=pos; } pos=y; while(cnt<n){ pos+=p; a[++cnt]=pos; } for(int i=1;i<=cnt;i++){ cout<<a[i]<<" "; } cout<<endl; } }