Tenka1 Programmer Contest C - Align

链接 Tenka1 Programmer Contest C - Align

  • 给定一个序列,要求重新排列最大化\(\sum_{i=2}^{i=n} |a_i-a_{i-1}|\)\(n\leq 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;
}

猜你喜欢

转载自www.cnblogs.com/Tyher/p/9863504.html