B. Motarack's Birthday
题目意思:
给你一串数组,其中-1代表未知,求相邻两个数之差的绝对值最小
想法:
我们先假设 -1 的位置代表 k ,那么我们要让它和它前后两个数的最大差值最小 也就是 | k-a | | k-b | | k-c | .... 那么会发现其实也就是和 a,b,c .. 中最大的、最小的差值要最小
那么就是 k 的值应该就是 max和 min的中间值
找到了 k 再去跑一遍整个数组,求得整个是数组的最大差值
#include <iostream> #include <algorithm> #include <string> #include <string.h> #include <vector> #include <map> #include <stack> #include <set> #include <queue> #include <math.h> #include <cstdio> #include <iomanip> #include <time.h> #include <bitset> #include <cmath> #define LL long long #define INF 0x3f3f3f3f #define ls nod<<1 #define rs (nod<<1)+1 const double eps = 1e-10; const int maxn = 1e5 + 10; const LL mod = 1e9 + 7; int sgn(double a){return a < -eps ? -1 : a < eps ? 0 : 1;} using namespace std; int a[maxn]; int n; int main() { int T; cin >> T; while (T--) { cin >> n; int l = INF,r = 0; for (int i = 1;i <= n;i++) { cin >> a[i]; } for (int i = 1;i <= n;i++) { if (a[i] == -1) { if (i-1 >= 1 && a[i-1] != -1) l = min(l,a[i-1]),r = max(r,a[i-1]); if (i+1 <= n && a[i+1] != -1) l = min(l,a[i+1]),r = max(r,a[i+1]); } } int mid = (l + r) >> 1; int m = 0; for (int i = 1;i+1 <= n;i++) { int k1 = a[i],k2 = a[i+1]; if (k1 == -1) k1 = mid; if (k2 == -1) k2 = mid; m = max(m,abs(k1-k2)); } cout << m << " " << mid << endl; } return 0; }
分类:
Codeforces
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· DeepSeek+PageAssist实现本地大模型联网
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· 从 14 秒到 1 秒:MySQL DDL 性能优化实战