Atcoder Beginner Contest 444 - C
C - Atcoder Riko
前言
后天就过年了,这里先提前祝大家:
┬┴┬┌─ ●─┬─ │─┼─┐ ●├─┤○
┴┬┴├┬ ┌─┼─ │◎ │ │ ○└┬┘●
─┼─││ │ │ ││─┴─┴ ──┼──
●│○││ ┴─┼─ │○ ● / │ \
题目大意
💡提示:完整题目翻译见 ABC444 - C 翻译
有一盒 A t C o d e r AtCoder AtCoder 公司推出的 A t C o d e r i k o AtCoderiko AtCoderiko 零食,我们可以简单的理解为巧克力棒。有个大神经高桥,闲的没事摇晃装在杯子里的巧克力(每根长度为 l l l ),每根巧克力摇晃后都会处在以下两种状态之一:
-
保持长度为 l l l (巧克力没有断)
-
断裂成两根长度之和为 l l l 的巧克力棒(你怎么能忍心对巧克力棒下毒手,巧克力棒多可爱呀)
思路
可以分类讨论本题,一共有两种情况:
-
杯子中的每一根巧克力棒都惨遭毒手
如果这样, max i a [ i ] \max_i a[i] maxia[i] 和 min i a [ i ] \min_i a[i] minia[i] 必然可以匹配为一根巧克力棒,所以 l l l 为 max i a [ i ] + min i a [ i ] \max_i a[i]+\min_i a[i] maxia[i]+minia[i]
-
杯子里至少有一个幸运儿
如果是这个样子,与 max i a [ i ] \max_i a[i] maxia[i] 相等的数一定没有进行分裂, l l l 不能大于序列的最大值,所以 l l l 为 max i a [ i ] \max_i a[i] maxia[i]
实现
考虑先进行降序排序:
cpp
sort(a+1,a+n+1);
然后写 s o l v e ( l l ) solve(ll) solve(ll) 函数, l l ll ll 表示确定的 l l l ,双指针计算是否满足条件
cpp
int solve(int ll){
int l=1,r=n,f=1;
while(l<=r){
if(a[r]==ll){
r--;
}else if(a[r]+a[l]==ll&&r!=l){
l++,r--;
}else{
f=0;
break;
}
}
return f;
}
最后判断,输出即可
AC代码
cpp
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[300010];
int n;
int solve(int ll){
int l=1,r=n,f=1;
while(l<=r){
if(a[r]==ll){
r--;
}else if(a[r]+a[l]==ll&&r!=l){
l++,r--;
}else{
f=0;
break;
}
}
return f;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
if(solve(a[n]))cout<<a[n]<<" ";
if(solve(a[1]+a[n]))cout<<a[1]+a[n];
return 0;
}