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; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮

浙公网安备 33010602011771号