[atARC121D]1 or 2
对于大小为1的集合,我们可以在其中加入0
因此,枚举0的个数,那么问题即可以看作要求每一个集合大小为2
(特别的,我们允许存在$\{0,0\}$,因为这样删除这两个0显然只会减小极差)
显然此时贪心将最小与最大、次小与次大……放入一个集合中即可
关于正确性,设最小值和最大值为$A,D$,若$\{A,D\}$则继续归纳即可,否则若$\{A,B\}$和$\{C,D\}$,那么有
$$
\begin{cases}\min(A+D,B+C)\ge \min(A+B,C+D)\\\max(A+D,B+C)\le \max(A+B,C+D)\end{cases}
$$
(关于这两个式子,左边的每一项都存在右边的一项小于等于或大于等于其)
因此不妨改为$\{A,D\}$和$\{B,C\}$,显然只会减小极差
具体实现可以先排序,再按照正负分开并加入0即可

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 5005
4 vector<int>vn,vp;
5 int n,mx,mn,ans,a[N];
6 void add(int x){
7 mx=max(mx,x);
8 mn=min(mn,x);
9 }
10 int main(){
11 scanf("%d",&n);
12 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
13 sort(a+1,a+n+1);
14 for(int i=1;i<=n;i++)
15 if (a[i]<=0)vn.push_back(a[i]);
16 for(int i=n;i;i--)
17 if (a[i]>0)vp.push_back(a[i]);
18 if (n&1)vn.push_back(0);
19 ans=2e9;
20 for(int i=(n&1);i<=n;i+=2,vn.push_back(0),vn.push_back(0)){
21 mx=-2e9,mn=2e9;
22 if (vn.size()<vp.size()){
23 for(int j=0;j<vn.size();j++)add(vn[j]+vp[j]);
24 for(int j=0;j<(vp.size()-vn.size())/2;j++)add(vp[vn.size()+j]+vp[vp.size()-j-1]);
25 }
26 else{
27 for(int j=0;j<vp.size();j++)add(vn[j]+vp[j]);
28 for(int j=0;j<(vn.size()-vp.size())/2;j++)add(vn[vp.size()+j]+vn[vn.size()-j-1]);
29 }
30 ans=min(ans,mx-mn);
31 }
32 printf("%d",ans);
33 }
[atARC121D]1 or 2的更多相关文章
随机推荐
- Three 之 Animation 初印象
Animation 初印象 动画效果 播放动画需要基本元素 AnimationMixer 一个对象所有动作的管理者 用于场景中特定对象的动画的播放器.一个对象可能有多个动作,Mixer 是用来管理所有 ...
- Linux文件系统与inode、Block笔记
Linux文件系统与inode.Block笔记 在Linux下一切都是文件,无论是设备还是接口,亦或是网卡等均被抽象成了文件,并且有相关的内核代码进行调度.然而,在一切都是文件的前提下,最需要进行探讨 ...
- FFT&原根&NTT&MTT
FFT bilibili 3b1b视频讲解 核心过程: 原根 Definition 若 \(a\) 模 \(m\) 的阶等于 \(\varphi(m)\),则称 \(a\) 为模 \(m\) 的一个原 ...
- 题解「BZOJ4310」跳蚤
题目传送门 Description 现在有一个长度为 \(n\) 的字符串,将其划分为 \(k\) 段,使得这 \(k\) 段每一段的字典序最大子串中字典序最大的字符串字典序尽量小.求出这个字符串. ...
- 初识Linux shell
目录 初识Linux shell Linux 深入探究Linux内核 系统内存管理 交换空间 页面 换出 软件程序管理 Linux中的进程 Linux系统的运行级 硬件设备管理 插入设备驱动代码的方法 ...
- modal框
modal框 创建modal款的基本"框架": 1 <body> 2 <!--1.触发模态框的按钮--> 3 <button class=" ...
- Johnson 全源最短路径算法学习笔记
Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...
- jenkins的安装、配置使用
1.jenkins的使用 (1).需要先下载安装JDK 配置jdk的环境 变量JAVA_HOME的值是 jdk 的安装位置, 然后下载安装tomcat 安装好了之后,打开tomcat下的bin文件夹, ...
- 网络通信IO的演变过程(一)(一个门外汉的理解)
以前从来不懂IO的底层,只知道一个大概,就是输入输出的管道怼到一起,然后就可以传输数据了. 最近看了周志垒老师的公开课后,醍醐灌顶. 所以做一个简单的记录. 0 计算机组成原理相关 0.1. 计算机的 ...
- Java字符串分割函数split源码分析
spilt方法作用 以所有匹配regex的子串为分隔符,将input划分为多个子串. 例如: The input "boo:and:foo", for example, yield ...