题解 [ARC121D] 1 or 2
诈骗题,竟然评到了 的惊人高分(快到红了),来补个题解。
题意:有两个可重集 , 初始为 。每次从 中删除一个或两个数,并将它们的和加入 中,重复操作直到 。最小化 的极差。
。
如果每次必须删除两个数,显然最小与最大、次小与次大配对是最优的,可以用交换法证明。观察到删除一个数的操作等价于删除 和那个数。因此枚举有多少次删除一个数的操作,补充那么多个 之后跑刚刚的贪心即可。
容易做到 ,但我懒得做到,所以写了一个 。
//By: OIer rui_er
#include <bits/stdc++.h>
#define rep(x,y,z) for(ll x=(y);x<=(z);x++)
#define per(x,y,z) for(ll x=(y);x>=(z);x--)
#define debug(format...) fprintf(stderr, format)
#define fileIO(s) do{freopen(s".in","r",stdin);freopen(s".out","w",stdout);}while(false)
using namespace std;
typedef long long ll;
const ll N = 1e4+5, inf = 0x3f3f3f3f3f3f3f3fll;
ll n, a[N], b[N], ans = inf;
template<typename T> void chkmin(T& x, T y) {if(x > y) x = y;}
template<typename T> void chkmax(T& x, T y) {if(x < y) x = y;}
int main() {
scanf("%lld", &n);
rep(i, 1, n) scanf("%lld", &a[i]);
rep(i, 0, n) {
ll L = 1, R = n + i;
if((R - L + 1) & 1) continue;
rep(j, 1, n) b[j] = a[j];
rep(j, n+1, n+i) b[j] = 0;
sort(b+1, b+1+n+i);
ll mn = inf, mx = -inf;
while(L < R) {
chkmin(mn, b[L] + b[R]);
chkmax(mx, b[L] + b[R]);
++L; --R;
}
chkmin(ans, mx - mn);
}
printf("%lld\n", ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现