Tenka1 Programmer Contest C - Align

Posted tyher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tenka1 Programmer Contest C - Align相关的知识,希望对你有一定的参考价值。

链接 Tenka1 Programmer Contest C - Align

  • 给定一个序列,要求重新排列最大化(sum_{i=2}^{i=n} |a_i-a_{i-1}|)(nleq 10^5)
  • 小清新贪心,首先把最大的先放好,然后依次考虑下面四种决策:
  • 左边放最小,右边放最小,左边放最大,右边放最大。
  • 每次取(max)并更新左右端点,这样一定能取到最大最小的波浪形态,最大值旁边放两个最小不会更差。
#include<bits/stdc++.h>
#define R register int
#define ll long long 
using namespace std;
const int N=100001;
int n,w[N],res[N],le,ri,z,y;ll ans;
int gi(){
    R x=0,k=1;char c=getchar();
    while(c!=‘-‘&&(c<‘0‘||c>‘9‘))c=getchar();
    if(c==‘-‘)k=-1,c=getchar();
    while(c>=‘0‘&&c<=‘9‘)x=(x<<3)+(x<<1)+c-‘0‘,c=getchar(); 
    return x*k;
}
int main(){
    n=gi();
    for(R i=1;i<=n;++i)w[i]=gi();
    sort(w+1,w+n+1);
    le=2,ri=n,z=w[1],y=w[1];
    while(le<=ri){
        R p=abs(w[le]-z),q=abs(w[le]-y),a=abs(w[ri]-z),b=abs(w[ri]-y),Mx=max(max(p,q),max(a,b));
        if(Mx==p)z=w[le],le++;
        else if(Mx==q)y=w[le],le++;
        else if(Mx==a)z=w[ri],ri--;
        else y=w[ri],ri--;
        ans+=Mx;
    }
    cout<<ans<<endl;
    return 0;
}

以上是关于Tenka1 Programmer Contest C - Align的主要内容,如果未能解决你的问题,请参考以下文章

Atcoder Tenka1 Programmer Contest 2019

Tenka1 Programmer Contest 2019 D - Three Colors

AtCoderTenka1 Programmer Contest 2019

nios ii中flash programmer 下载出错

8 Traits of an Experienced Programmer that every beginner programmer should know

如何成为一名:黑客/Programmer/Python高手