【补题】Codeforces Round 776 (Div. 3) E. Rescheduling the Exam
题意:
思路: CF1650E Rescheduling the Exam - 洛谷
原题解写的非常清楚,可以去看看
假设只有三节课,很明显最佳放法只有两种
1.放到中间
2.放到最后面的d天,这个很重要,因为最后一节课之后的天数是不算的,不计入最后作为间隔天数,所以直接放在最末尾就行了
那么对于一个被移动的课程,原先的相邻的距离会受到影响,很明显的延长了,但是其他地方不会受影响,这就给了贪心的可能
那么对于这个被移动走的课程,肯定是移动这个课程与其他课程的有着最差间距的课程,那肯定就是放在最长的间隔中间,或者放在最后,这样才能最有效的延长间隔天数,但不要忘了可能延长后,依旧存在其他间隔小于试图延长后的。
那么对于那个课程,我们试图延长的是他们的间距,那么可能移动前者好,也可能移动后者好
都判断一下即可
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS \std::ios::sync_with_stdio(0); \std::cin.tie(0); \std::cout.tie(0)const int N = 3e5 + 5;
const int INF = 1e18;
// const int MOD = 998244353;
const int MOD=1e9+7;
// const int MOD=100003;
const int maxn=5e5+10;void solve(){int n,d;cin >> n >> d;vector<int> ve(n);for(int i=0;i<n;i++){cin >> ve[i];}int st=0;int pos=0;int mindist=INF;for(int i=0;i<n;i++){int dist=ve[i]-st-1;if(mindist>dist){pos=i;mindist=dist;}st=ve[i];}// cout << "POS " << " " << pos << '\n';int maxnum=0,minnum=INF;int last=0;for(int i=0;i<n;i++){if(i==pos) continue;int dist=ve[i]-last-1;maxnum=max(maxnum,dist);minnum=min(minnum,dist);last=ve[i];}int res=min(minnum,max((maxnum-1)/2,d-last-1));if(pos!=0){pos-=1;maxnum=0,minnum=INF;last=0;for(int i=0;i<n;i++){if(i==pos) continue;int dist=ve[i]-last-1;maxnum=max(maxnum,dist);minnum=min(minnum,dist);last=ve[i];}res=max(res,min(minnum,max((maxnum-1)/2,d-last-1)));}// cout << maxnum << " " << minnum << '\n';cout << res << '\n';
}signed main(){IOS;int t=1;cin >> t;while(t--){solve();}
}