1 条题解
-
0
自动搬运
来自洛谷,原作者为

PR_CYJ
逆水行舟,不进则退搬运于
2025-08-24 22:57:32,当前版本为作者最后更新于2024-05-02 09:06:38,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题目传送门
思路
这道题 所以显然不是模拟,接下来就考虑数学做法。
我们发现 ,所以 ,然后将 记为 ,所以 就是一条边相邻两点的点权和。
接下来就可以用 表示其它的点。 为 , 为 。以此类推,当 为奇数时, 就是 $v_{n-1}-v_{n-2}+v_{n-3}-v_{n-4}+\cdots +v_2-v_1+a_1$。因为 与 的和是 ,所以 $a_1+v_{n-1}-v_{n-2}+v_{n-3}-v_{n-4}+\cdots +v_2-v_1+a_1=v_n$,即 。
接着将右边式子分成两部分,即 和 。可以发现,若要使 最大,就要使 最大, 最小。而 最小时则相反。
最后只需要将 数组排序然后间隔输出即可。
代码
- 切勿抄袭!!!
#include<bits/stdc++.h> using namespace std; int n,smnw,bgnw,a[1000010]; int main() { ios::sync_with_stdio(0); cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1); cout<<a[n/2+1]; smnw=1; bgnw=n/2+2; for(int i=2;i<=n;i++)//当a1最大时 if (i&1) { cout<<" "<<a[bgnw]; bgnw++; } else { cout<<" "<<a[smnw]; smnw++; } cout<<endl<<a[1]; smnw=2; bgnw=n/2+2; for(int i=2;i<=n;i++)//当a1最小时 if (i&1) { cout<<" "<<a[smnw]; smnw++; } else { cout<<" "<<a[bgnw]; bgnw++; } }
- 1
信息
- ID
- 8280
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 2
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者