CodeForces - 1409C 构造等差数列

 

传送门

 

推导数组元素,有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;
    } 
}

 




posted @ 2020-12-03 00:02  哎呦哎(iui)  阅读(176)  评论(0编辑  收藏  举报