Loading

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\)

five_node

不难发现 $ (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;
}
posted @ 2024-06-15 12:58  MingJunYi  阅读(19)  评论(0)    收藏  举报