来源:牛客网
超市里一共有 nnn 个货架,mmm 个商品,一开始商品的位置是被打乱的,小Why需要将商品全部归位。
小Why在给货架编号后,实现了每个商品所在货架必然在其应在货架之前。
小Why决定手推购物车按编号顺序依次访问每个货架。在访问货架时,小Why可以执行以下两个操作任意多次:
∙\bullet∙ 当购物车不为空时,将购物车中的一个商品放上货架。
∙\bullet∙ 当货架不为空时,将货架上的一个商品放入购物车。
当小Why跑完一趟后,如果仍有商品没被归位,那么小Why会再次返回 111 号货架重复以上过程。
超市里的购物车同一时刻最多能放 kkk 个商品,且每个货架容量无限,请你告诉小Why至少需要跑多少趟才能将商品全部归位。
输入描述:
第一行包括三个整数 n,m,k (2≤n≤106,1≤m,k≤106)n,m,k \ (2 \leq n \leq 10^6 , 1\leq m,k\leq10^6)n,m,k (2≤n≤106,1≤m,k≤106),表示货架个数,商品个数和购物车容量。
接下来 mmm 行,每行有两个整数 sti,edi(1≤sti<edi≤n)st_{i},ed_{i} ( 1 \leq st_{i} < ed_{i} \leq n)sti,edi(1≤sti<edi≤n),表示第 iii 个商品的所在货架和应在货架。
输出描述:
输出一个整数,表示最少需要的趟数。
分析:
从开始道路运到最后的道路,重叠的要放一起,差分加前缀和求出重叠次数最多的,÷购物车容量就是答案,要向上取整
cpp
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
void solve()
{
ll n,m,k;
cin>>n>>m>>k;
ll sums[n+1];
memset(sums,0,sizeof sums);
for(ll i=0;i<m;i++)
{
ll st,ed;
cin>>st>>ed;
sums[st]++;
sums[ed]--;
}
ll maxn=-1;
for(ll i=1;i<=n;i++)
{
sums[i]+=sums[i-1];
maxn=max(sums[i],maxn);
}
cout<<(maxn/k+(maxn%k!=0))<<'\n';
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ll t=1;
while(t--)
solve();
return 0;
}