1. 程式人生 > >Codeforces 1093C (思維+貪心)

Codeforces 1093C (思維+貪心)

ios 題目 std define 長度 ostream pri contest %d

題面

傳送門

題目大意:

有一個長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 (思維+貪心)