cf 1093c 思维

题意:

有一个长n(n为偶数)的序列a,已知a满足 a1≤a2≤⋯≤an,给出一个长度为n/2的序列b,定义bi=ai+an−i+1,输出任意一种符合题意的序列a。

题解:

1.先初始化a[1] = 0 , a[n] = b[n / 2],再一对一对地向中间添加序列a的元素。

2.成对添加的方法:举一个例子,假如添加a[2] 和 a[n - 1],那么保证a[2]>=a[1]且尽可能接近a[1]a[n - 1]<=a[n]且尽可能接近a[n],具体操作见代码。

#include
using namespace std;
#define N 200005
long long a[N] , b[N] ;
int main()
{
   int n ;
   int i ;
   int l , r ;
   long long min1 ;
   scanf("%d" , &n) ;
   for(i = 1 ; i <= n / 2 ; i ++)
      scanf("%lld" , &b[i]) ;
   a[1] = 0 , a[n] = b[1] ;
   for(i = 2 ; i <= n / 2 ; i ++)
   {
   	 l = i ;
   	 r = n - i + 1 ;
   	 a[l] = b[i] / 2 ;
   	 a[r] = b[i] / 2 + b[i] % 2 ;
   	 min1 = min(a[l] - a[l - 1] , a[r + 1] - a[r]) ;
   	 a[l] -= min1 ;
   	 a[r] += min1 ;
   }
   for(i = 1 ; i <= n ; i ++)
      printf("%lld " , a[i]) ; 
}

 

你可能感兴趣的:(思维)