背景
"梦中伊人,断我男儿几寸柔肠,于断桥,不知西风自憔悴那姑娘。"小v的梦中伊人要带领一大帮姐妹MM们来小v家举办舞会,然而怎么安排跳舞的顺序成了大问题,你能帮他么?
描述
有n个MM要站成若干个圈来跳华尔兹,而每个MM都有一个漂亮值Si,跳舞时第i个MM所表现出来的漂亮值为:该MM的漂亮值与其后面MM的漂亮值之差的绝对值(规定顺时针方向为向后),如果某个MM单独站成一个圈(假设能站成),则其漂亮值为0,你的任务是找出这个最大能表现出的漂亮值。
输入格式
第一行一个整数n,表示n个MM
第二行n个整数,第i个整数表示第i个MM的漂亮值
第二行n个整数,第i个整数表示第i个MM的漂亮值
输出格式
一行一个整数,表示能表现出的最大漂亮值
测试样例1
输入
6
12 11 24 17 12 24
输出
60
备注
数据范围:
对于10%的数据,0<n<=10,0<Si<=100
对于40%的数据,0<n<=50,0< Si <=1000
对于100%的数据,0<n<=300,0<Si<=1000000
结果保证不大于2^31.
对于10%的数据,0<n<=10,0<Si<=100
对于40%的数据,0<n<=50,0< Si <=1000
对于100%的数据,0<n<=300,0<Si<=1000000
结果保证不大于2^31.
//贪心,取两头,怎么证明我不懂 #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #define ll long long using namespace std; ll n,a[10005],b[10005],sum; int main(){ cin>>n; for(int i = 1;i <= n;i++) scanf("%lld",&a[i]); sort(a+1,a+1+n); int l = 1,r = n,opt = 0; for(int i = 1;i <= n;i++){ if(!opt) b[i] = a[l++]; else b[i] = a[r--]; opt ^= 1; } b[0] = b[n]; for(int i = 1;i <= n;i++){ if(b[i] > b[i-1]) sum += b[i] - b[i-1]; else sum += b[i-1] - b[i]; } cout<<sum; return 0; }