Rescheduling the Exam cf1650e
(仅做为个人笔记,反思)
题目意思:t组数据,n场考试,考试不能不会在同一天,考试时长d,给出定义:休息时长为某门考试前的天数(r-l-1)。现求改变其中一门使所有休息天数中最小值
最大,输出天数
思路:
code:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N=2e5+7;
const int inf=1e9+7;
int a[N];//存储第i门考试的时间
int n,d;//门数,周期
int check(vector<int>&v)//计算目前排列插入一门考试后的最小值
{
int minn=inf;//如果不插入可能也会有最小值
int maxn=0;//所以得在最大间隔内插入
for(int i=1;i<n;i++)
{
minn=min(minn,v[i]-v[i-1]-1);
maxn=max(maxn,v[i]-v[i-1]-1);
}
return min(minn,max((maxn-1)/2,d-v.back()-1));//所以在本身最小值,和插入后的最小值比较,返回更小的,因为要找最小值
}
int main()
{
int t;cin>>t;//测试数量
while(t--)
{
cin>>n>>d;
int mindis=d,id=0;//最小间隔,对应的下标
for(int i=1;i<=n;i++)//找到目前导致最小值出现的科目
{
cin>>a[i];
if(a[i]-a[i-1]-1<mindis)//若找到更小的,更新数据
{
mindis=a[i]-a[i-1]-1;
id=i;
}
}
vector<int>v;//存储删去id后所有开始时间
for(int i=0;i<=n;i++)
{
if(i==id)continue;
v.push_back(a[i]);
}
int ans=max(0,check(v));//最小值的最大值
if(id>1)//如果不是第一个,还得讨论是不是左边的那门考试导致的
{
v[id-1]=a[id];
ans=max(ans,check(v));
}
cout<<ans<<endl;
}
}
date:23.2.26
浙公网安备 33010602011771号