CF1740C题解
众所周知,这道题的难度是 1400,所以是简单题。
分析
首先,坚信这是一道简单题,所以不要想复杂了。
首先我们需要对
下面,我们假设
翻译一下,这四种情况的答案分别是:
你感性理解一下,你就会发现前两种情况一定不会比后两种优(因为如果出现这两种情况,你只需要将其中两个背包交换一下位置就会转化为后面两种,而明显转化后会更优,这个你自己手模一下应该很显然),于是我们就只用考虑后面两种情况就可以了,即:
但是你会发现,即使是这样,我们任然不能很好的限制计算方法,于是我们考虑继续加强条件。
下面我们以第三种情况为例加强限制(第四种的推理过程是一样的):
我们假设有
- 如果
这根棍子被放在了第 个背包中,那么朋友在背包 中选择下标为 的棍子而不是 ,因为 ,因此假设不成立; - 如果
这根棍子被放在了第 个背包中,那么朋友在背包 中选择下标为 的棍子而不是 ,因为 ,因此假设不成立; - 如果
这根棍子被放在了第 个背包中,那么朋友在背包 中选择下标为 的棍子而不是 ,因为 ,因此假设不成立。
于是我们发现,在
的时候我们才能确定朋友所选取的棍子就是我们“指定”的那三根。
这个条件化简一下其实就是:
而我们需要最大化
于是我们就做完了,对就是这么简单,区区 1400 而已,是真的不能把他想的太难了,不然真的很容易想偏。
附源码:
#include<bits/stdc++.h>
using namespace std;
int t;
int a[10000];
int main(){
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
int ans=0;
for(int i=3;i<=n;i++){
ans=max(ans,a[i]-a[1]+a[i]-a[i-1]);//1,i~n,2~i-1
}
for(int i=1;i<=n-2;i++){
ans=max(ans,a[n]-a[i]+a[i+1]-a[i]);//n,1~i,i+1~n-1
}
printf("%d\n", ans);
}
return 0;
}
本人(KK_SpongeBob)蒟蒻,写不出好文章,但转载请注明原文链接:https://www.cnblogs.com/OIer-QAQ/p/18575290
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期