因为是一根断裂成两根或不变,所以我们可以很快的想到这个答案要么是最大+最小,要么就是最大
这个容易证明,因为如果不选这些情况就一定可以通过最大的那根构造出更大的一根
模拟即可
AC代码
Details
#include<bits/stdc++.h>
using namespace std;
#define QAQ return
#define QWQ return 0;
#define ll long long
#define pii pair< int,int >
const int N=3e5+10;
ll a[N];
int main()
{
ios::sync_with_stdio( false );
cin.tie( nullptr ), cout.tie( nullptr );
int n;
cin>>n;
for( int i=1;i<=n;i++ ) cin>>a[i];
sort( a+1,a+n+1 );
ll maxv=a[n];
bool flag=true;
int num=0;
for( int i=n;i>=1;i-- )
if( a[i] == maxv ) num++;
else break;
for( int i=1, j=n-num;i<j;i++, j-- ) flag&=( a[i]+a[j] == maxv );
if( n-num&1^1 && flag ) cout<<maxv<<" ";
flag=true;
ll sum=a[1]+a[n];
for( int i=1, j=n;i<j;i++, j-- ) flag&=( a[i]+a[j] == sum );
if( n&1^1 && flag ) cout<<sum;
QWQ
}
时间复杂度:O(nlogn)