https://vjudge.net/contest/536521#problem/B
给出一个k,表示序列长度,n表示序列最大值,序列的价值为相邻两项差的元素个数,如:
1 2 3 4 5的价值为1,因为没每两项只差都是1,1 2 5 6 7的价值为2,每两项之差是3或1
如此,再最大值一定的情况下,要想元素多,元素就要小,因此价值序列(每两项只差)为 1 2 3 4
如 1 2 4 7 11
我们首先要保证能够输出一个递增序列,如第一组k=5,n=9时,先让序列为1 2 3 4 5,再在最大值不超过9,的情况下来改造。目前该序列价值是1,要让他变大,就要让某两项只差为2,3,4,如果让a3-a2=2,那么1 2 4 5 6,我们让第三项变大1,这样为了维持递增性,后项都要变大1,原来的最大值从5变成6,为了不超过最大值9,价值序列之和不能超过9-5=4,再此情况下,1+2<4<1+2+3,所以我们先将第三项加一,1 2 4 5 6,再将第四项加二,1 2 4 7 8,相邻只差分别为,1 2 3 1,价值为3,因为
4>1+2,我们要变大两个数字,所以我的代码是从倒数第2项开始变大,只要符合题意便可。
#include<stdio.h>
int a[50],b[50];
int main()
{
int n,a1,b1,max,q,sum,sumsum;
scanf("%d",&n);
while(n--)
{
for(int i=0;i<50;i++)
{
a[i]=i;//基础序列
}
sum=0;
scanf("%d %d",&a1,&b1);
max=b1-a1;
for(int i=0;sum<=max;i++)//价值序列之和不能超过
{
sum+=i;
b[i]=i;
q=i-1;//记录需要变大的个数
}
for(int i=a1-q;i<=a1;i++)
{
for(int j=a1-q;j<=i;j++)
{
a[i]+=b[j+q-a1];//每一项变大后,维持递增性,所以前项加过的后项需再加一次
}
}
for(int i=1;i<=a1;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
return 0;
}