这个题主要是考察的二分+贪心结合去找最小值最大化的问题
在这个题当中我们可以看到需使用优先队列(最小堆)来管理烤架可用时间(快速找到最早可用烤架)
cpp
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
const int N=100010;
ll n,k,d;
ll a[N];
bool can(ll t)
{
priority_queue<ll,vector<ll>,greater<ll>> pq;
for(int i=0;i<k;i++)pq.push(0);
for(int i=0;i<n;i++)
{
ll avail=pq.top();//空闲烤架的时间
pq.pop();
ll start=max(avail,a[i]);//得到目前能用烤架的最小时间
ll finish=start+d;//得到考场的时间
if(finish>t)return false;
pq.push(finish);
}
return true;
}
int main()
{
cin>>n>>k>>d;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n);
ll l=a[0]+d;
ll r=a[n-1]+n*d;
while(l<r)
{
ll mid=l+(r-l)/2;
if(can(mid))
{
r=mid;
}
else l=mid+1;
}
cout<<l<<endl;
return 0;
}