[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的更多相关文章
随机推荐
- centos6.5 oracle 卸载
1.使用SQL*PLUS停止数据库 [oracle@OracleTest oracle]$ sqlplus / as sysdba SQL> shutdown immediate; SQL> ...
- Redis缓存穿透、缓存击穿、缓存雪崩的介绍及其解决方案
首先,来画一张图了解下缓存处理的流程 一.缓存穿透 描述: 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求查询该数据,导致数据库压力过大. 解决方案: 1.接口校验 如鉴权校验.数据合法性 ...
- 生成base64图片验证码
github.com/mojocn/base64Captcha func GetCaptcha(c *gin.Context){ driver := base64Captcha.NewDriverDi ...
- mysql创建用户及赋予某用户权限(附带基础查看表内容)
首先登陆mysql 一:show databases; 展示所有数据库(root用户下) 二:use xxx (数据库名)使用use选择数据库 三:show xxx 查看数据库中的表 四:des ...
- ArrayList-源码分析-自动扩容机制
ArrayList类: public class ArrayList....{ ...... private static final int DEFAULT_CAPACITY = 10; //默认容 ...
- Java(15)面向对象之继承
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201615.html 博客主页:https://www.cnblogs.com/testero ...
- Spark分区器浅析
分区器作用:决定该数据在哪个分区 概览: 仅仅只有pairRDD才可能持有分区器,普通RDD的分区器为None 在分区器为None时RDD分区一般继承至父RDD分区 初始RDD分区数: 由集合创建,R ...
- Succeed_School
# Author kevin_hou class School(object): def __init__(self,name,addr): self.name = name self.addr = ...
- UltraSoft - Beta - Scrum Meeting 1
Date: May 17th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 维护Beta阶段文档 Liuzh 前端 增加删除操作按钮 Kkkk 前端 查询增加 ...
- Vue接收后端传过来excel表格的文件流并下载
题外话:当接收文件流时要确定文件流的类型,但也有例外就是application/octet-stream类型,主要是只用来下载的类型,这个类型简单理解意思就是通用类型类似 var .object.ar ...