P10393 无限循环?题解
P10393 无限循环?
1.分析
自然画图入手,先从 \(5\) 个点入手
设 \(5\) 个点为 \(a_1,a_2,a_3,a_4,a_5\)
边权为 \(w_1,w_2,w_3,w_4,w_5\)

不难发现 $ (1) - (2) + (3) - (4) +(5) \Rightarrow a_1 = w_1 - w_2 + w_3 - w_4 + w_5 $
故由上推广:对于 \(n\)(\(n\) 为奇数)个点,\(a_1 = w_1 - w_2 + w_3 - w_4 +... - w_{n-1} + w_n\)
整理可得 \(a_1 = \sum_{i \in odd} w_i - \sum_{i \in even} w_i\)
让 \(a_1\) 最大化,只需让 \(\sum_{i \in odd} w_i\) 最大化且 \(\sum_{i \in even} w_i\) 最小化
让 \(a_1\) 最小化反之即可
2.行动
先排序,然后用指针 \(i,j\) 在站在 \(w\) 数组头和尾,当输出位为奇数位,将指向 较小/较大 的数输出,让该指针向中间移动
code:
#include <bits/stdc++.h>
using namespace std;
CIN N = 1e6+5;
int n,w[N];
signed main(){
cin>>n;
for(int i = 1;i<=n;i++) cin>>w[i];
sort(w + 1,w + n + 1);
// a_1位最大
for(int i = 1,j = n,t = 1;i <= j;t++) {
if(t & 1) cout<<w[j--]<<' ';
else cout<<w[i++]<<' ';
}
cout<<'\n';
//a_1位最小
for(int i = 1,j = n,t = 1;i <= j;t++){
if(t & 1) cout<<w[i++]<<' ';
else cout<<w[j--]<<' ';
}
return 0;
}

浙公网安备 33010602011771号