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
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
C - Yet Another Array Restoration | GNU C++17 | Accepted | 31 ms | 0 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;
}