Codeforces 1093C (思维+贪心)

Posted birchtree

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 1093C (思维+贪心)相关的知识,希望对你有一定的参考价值。

题面

传送门

题目大意:

有一个长n(n为偶数)的序列a

已知a满足 (a_1≤a_2≤?≤a_n)

给出一个长度为(frac{n}{2}) 的序列b,定义(b_i=a_i+a_{n-i+1})

求出序列a (输出任意一种答案即可)

分析

为了保证序列不下降,我们采用贪心的思想,先假设(a_i=a_{i-1}),这样给后面的数留有的余地更大

然后计算出(a_{n-i+1}=b_i-a_i),如果(a_{n-i+1}>a_{n-i+1+1}),即不满足不下降的条件,则进行局部调整

(a_{n-i+1}=a_{n-i+1+1}),重新计算(a_i=b_i-a_{n-i+1}) (注,设$a_{n+1}=+inf $)

由于(a_{n-i+1}>a_{n-i+2}),新的(a_i)的值会变大,依然满足不下降的条件

该方法的正确性显然,时间复杂度(O(n))

代码

#include<iostream>
#include<cstdio>
#define maxn 200005
#define INF 0x7fffffffffffffff
using namespace std;
int n;
long long a[maxn];
long long b[maxn];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n/2;i++) scanf("%I64d",&b[i]);
    a[n+1]=INF; 
    for(int i=1;i<=n/2;i++){
        a[i]=a[i-1];
        a[n+1-i]=b[i]-a[i];
        if(a[n+2-i]<a[n+1-i]){
            a[n+1-i]=a[n+2-i];
            a[i]=b[i]-a[n+1-i];
        }
    }   
    for(int i=1;i<=n;i++){
        printf("%I64d ",a[i]);
    }
}

以上是关于Codeforces 1093C (思维+贪心)的主要内容,如果未能解决你的问题,请参考以下文章

Diagonal Walking v.2 CodeForces - 1036B (思维,贪心)

CodeForces - 1251E2 (思维+贪心)

CodeForces 1238C(思维+贪心)

CodeForces - 1251C (思维+贪心+归并排序)

CodeForces - 1251B (思维+贪心)

Balanced Ternary String CodeForces - 1102D (贪心+思维)