T1:外卖
你当然可以通过直接全排列枚举走的顺序通过本题,但那样太麻烦了
其实本题可以分为以下三种情况:
- 点在最左侧,那么最短距离 最大值 最小值
- 点在最右侧,那么最短距离 最大值 最小值
- 点在中间,那么最短距离 最大值 最小值 + 最大值 ,最小值
代码实现
#include <bits/stdc++.h> using namespace std; using ll = long long; int main() { freopen("take_out.in", "r", stdin); freopen("take_out.out", "w", stdout); int a, b, c, d; cin >> a >> b >> c >> d; int mn = min(min(a, b), min(c, d)); int mx = max(max(a, b), max(c, d)); ll ans = mx-mn; if (mn < a and a < mx) ans += min(a-mn, mx-a); cout << ans << '\n'; return 0; }
T2:区间问题 I
首先,给定 ,如何快速计算 ?
令
那么我们可以发现, 是 的前缀和,所以原式可以写作
想要让 尽可能大,应该最小化 ,因此在计算 时,还需维护 ,因此答案为 。
代码实现
#include <bits/stdc++.h> #define rep(i, n) for (int i = 0; i < (n); ++i) using namespace std; using ll = long long; int main() { freopen("interval.in", "r", stdin); freopen("interval.out", "w", stdout); int n, k; cin >> n >> k; vector<ll> a(n); rep(i, n) cin >> a[i]; vector<ll> b(n); rep(i, n) b[i] = a[i]*a[i] - a[i] - k; vector<ll> s(n); rep(i, n) s[i+1] = s[i]+b[i]; ll ans = -1e18, mn = 0; for (int i = 1; i <= n; ++i) { ans = max(ans, s[i]-mn); mn = min(mn, s[i]); } cout << ans << '\n'; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具