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<bits/stdc++.h>
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]) ; 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值