版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CSDN___CSDN/article/details/87632576
http://codeforces.com/problemset/problem/1093/C
已知b[i]求a[i]和a[n-i+1],n是a数组中元素的个数,a数组的下标从1开始
输出b[1]的时候,直接让a[1] = 0,a[n] = b[0]
接下来的每一组,先让a[i] = b[i],然后求解a[n-i+1],如果出现a[n-i+1]>a[n-i+2],则让a[n-i+1]=a[n-i+2],保证了a数组递增,再来求a[i],因为a[n-i+1]变小,所以a[i]增大,仍然是递增序列
TLE
#include <iostream>
typedef unsigned long long ll;
using namespace std;
int a[200000+5];
int main ()
{
ios_base::sync_with_stdio(false);
ll n,x,i;
cin >> n;
for(i=1;i<=n/2;i++)
{
cin >> x;
if(i==1)
{
a[i] = 0;
a[n-i+1] = x;
}
else
{
a[i] = 0;
a[n-i+1] = x;
while(a[i]<a[i-1] || a[n-i+1]>a[n-i+2])
{
a[i]++;
a[n-i+1]--;
}
}
}
for(i=1;i<=n;i++)
{
if(i!=1)
cout << " ";
cout << a[i];
}
return 0;
}
AC
#include <iostream>
#include <cstdio>
typedef long long ll;
using namespace std;
ll a[200000+5];
int main ()
{
ll n,x,i;
scanf("%lld",&n);
for(i=1;i<=n/2;i++)
{
scanf("%lld",&x);
if(i==1)
{
a[1] = 0;
a[n] = x;
}
else
{
a[i] = a[i-1];
a[n-i+1] = x - a[i];
if(a[n-i+1] > a[n-i+2])
{
a[n-i+1] = a[n-i+2];
a[i] = x- a[n-i+1];
}
}
}
for(i=1;i<=n;i++)
{
if(i!=1)
printf(" ");
printf("%lld",a[i]);
}
return 0;
}