题意:一个数列a1,a2,,,,,,an,其中1<ai<l,1<=i<=n。进行如下操作:从最右边开始两个数a(n-1)和a(n)取出来,a(n-1)-a(n)得到一个新的数,然后加入到原来的数列中。如此操作下去,直到最后只剩下一个数。先给出最后的数d,和数的个数n,数的最大限制l,求是否有满足的数列,并求出(任意一个)。
分析原数列,a1,a2,,,,,,,an, 根据操作,a(n-1)-a(n) => a(n-2)-( a(n-1)-a(n) ) => a(n-3)-( a(n-2)-( a(n-1)-a(n) ) )
,,,,,,最后化简得:a1-a2+a3-a4+,,,,,,an=d => (a1+a3+a5...)-(a2+a4+a6...)=d
令a=(a1+a3+a5...) b=(a2+a4+a6...) ac=(n+1)/2 bc=n/2 则只要满足a>=ac b>=bc 且 a<=ac*l b<=bc*l 即可求出原数列。
My code:
//STATUS:C++_AC_31MS_0KB
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<set>
#define LL __int64
#define Max(x,y) ((x)>(y)?(x):(y))
#define Min(x,y) ((x)<(y)?(x):(y))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define mem(a,b) memset(a,b,sizeof(a))
const int MAX=110,INF=200000000,MOD=1000000007;
const double esp=1e-6;
int ans[MAX];
int n,d,l;
int main()
{
// freopen("in.txt","r",stdin);
int i,j,a,b,ac,bc,t;
while(~scanf("%d%d%d",&n,&d,&l)){
ac=(n+1)>>1;
bc=n>>1;
if(d>0){
b=bc;
a=b+d;
}
else {
a=ac;
b=a-d;
}
if((double)a/ac<=l && (double)b/bc<=l){
for(i=0;i<n;i+=2)
ans[i]=a/ac;
t=a%ac;
for(i=0;i<n && t;i+=2,t--)
ans[i]++;
for(i=1;i<n;i+=2)
ans[i]=b/bc;
t=b%bc;
for(i=1;i<n && t;i+=2,t--)
ans[i]++;
printf("%d",ans[0]);
for(i=1;i<n;i++)
printf(" %d",ans[i]);
putchar('\n');
}
else printf("-1\n");
}
return 0;
}