返回顶部

Codeforces Round #667 (Div. 3) C. Yet Another Array Restoration (数学)

  • 题意:给你两个数字\(x\)\(y\),让你构造一个长度为\(n\)的序列,要求包含\(x\)\(y\),并且排序后相邻两项的差值相等.

  • 题解:有排序后相邻两项的差值相等可知,构造的序列排序后一定是一个等差数列,而题目给的\(x\)\(y\)的范围很小,所以我们可以从\([1,50]\)来枚举公差\(d\),这个\(d\)必须要能整除\(x\)\(y\)的差值,并且\([x,y]\)的所有数的个数整除\(d\)上取整后不大于\(n\),这样找到的第一个\(d\),一定是最优解,直接构造输出即可.

  • 代码:

    int t;
    int n,x,y;
     
    int main() {
        //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    	t=read();
    	while(t--){
    		n=read();
    		x=read();
    		y=read();
    		int d;
    		for(int i=1;i<=50;++i){
    			if((y-x)%i==0 && (y-x+1-1)/i+1<=n){
    				d=i;
    				break;
    			}
    		}
    		for(int i=x;i<=y;i+=d){
    			if(n>0){
    				n--;
    				printf("%d ",i);
    			}
    		}
    		for(int i=x-d;i>=1;i-=d){
    			if(n>0){
    				n--;
    				printf("%d ",i);
    			}
    		}
    		for(int i=1;i<=n;++i){
    			printf("%d ",y+i*d);
    		}
    		puts("");
    	}
     
        return 0;
    }
    
posted @ 2020-09-05 20:23  _Kolibri  阅读(322)  评论(0)    收藏  举报