小Why的商品归位
问题建模
给定n个商品所在的货架以及要放置的货架,以及货架数m和购物车容量k,对于当前货架可以将货架上的货物放入购物车也可以将购物车上的货物放入货架上。每一次从1号货架开始到最后一个货架,问最少需要循环多少次可以将所有货物都归位。
问题分析
1.转换所求
将每个商品的信息转换为图形信息,即在一个数轴上,每个商品的起始货架到结束货架的点连一条直线。则每个点上有多少条直线经过,就表示该购物车到该货架时最多有多少个商品存在于购物车。则找到最多需要存在于购物车的商品数量,通过将其除以购物车容量就可计算出最多需要几次循环才能将所有商品归位。
2.通过差分获取所需信息
要求被线段覆盖次数最多的点的覆盖次数,则将一次覆盖视作最该段元素加1,则次数最多的点的元素大小即为所求,区间加,单点查询可以通过差分来完成。
代码
#include<bits/stdc++.h>
#define x first
#define y second
#define C(i) str[0][i]!=str[1][i]
using namespace std;
typedef unsigned long long ULL;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
const int N =1e6+10,INF=0x3f3f3f3f;
int a[N];
void solve() {
int n,m,k;
cin >>n >>m >>k;
for(int i=0;i<m;i++){
int x,y;
cin >>x >>y;
a[x]++,a[y]--;
}
int maxval=0;
for(int i=1;i<=n;i++){
a[i]+=a[i-1];
maxval=max(maxval,a[i]);
}
cout <<(maxval+k-1)/k <<"\n";
}
int main() {
int t = 1;
//cin >> t;
while (t--) solve();
return 0;
}