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
8 Traits of an Experienced Programmer that every beginner programmer should know