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;
}
本文详细解析了CodeForces 1093C题目,介绍了如何根据已知数组b求解a数组,确保其为递增序列。提供了两种代码实现方式,一种使用cin和cout导致TLE,另一种使用scanf和printf通过测试,展示了算法优化的重要性。
404

被折叠的 条评论
为什么被折叠?



