CF1650E Rescheduling the Exam
CF1650E
原题链接 ←CLick it
题目大意:有一段到的数轴,有个点,第个点的坐标为(单调递增且不等),定义第个点的值为(),现在你可以改变一次第个点的在数轴上的位置,问经过这样的操作后所有点的值的最小值可能的最大值。
解题思路:考虑改变值最小的点和它前面的一个点,因为如果这个点的值存在,那么得到的结果一定是这个点的值。改变这个点,就让这个点和后面一个点的值合并,从而增大这个点的值;改变这个点前面的一个点,就是让这个点和前面一个点的值合并,从而增大这个点的值。考虑这个点插入的位置,其一是最大值的中间,其二是的位置,我们可以取这两个位置的最大值。
参考代码:
int n, d;
int cal(vector<int> &b) {
int mi = INF, mx = 0;
for(int i = 1; i < b.size(); i ++) {
mx = max(mx, b[i] - b[i - 1] - 1);
mi = min(mi, b[i] - b[i - 1] - 1);
}
return min(mi, max(d - b[b.size() - 1] - 1, (mx - 1) >> 1));
}
void solve() {
cin >> n >> d;
vector<int> a(n + 1);
int min_idx, res = INF;
for(int i = 1; i <= n;i ++) {
cin >> a[i];
if(a[i] - a[i - 1] - 1 < res) {
res = a[i] - a[i - 1] - 1;
min_idx = i;
}
}
vector<int> b;
for(int i = 0; i <= n; i ++) {
if(i != min_idx) {
b.push_back(a[i]);
}
}
res = max(res, cal(b));
if(min_idx > 1) {
min_idx --;
b[min_idx] = a[min_idx + 1];
res = max(res, cal(b));
}
cout << res << '\n';
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】