之前没见过这种前缀和的用法
题目
思路:记录下每个高度矩形的数量,我们再用后缀和对数量做一遍预处理,然后用后缀和的后缀和就能表示由高到低一共花费了多少。
关于后缀和的后缀和就能表示花费,大家可以手动模拟一下试试。
原本看到这个题感觉很简单,不就贪心模拟,结果上手发现自己代码写不出来,才觉知此题确有水准。
#include <bits/stdc++.h>
using namespace std;
int h[200000+10];
int sum[200000+10];
int main()
{
freopen("in.txt","r",stdin);
int n,k,ans=0,tot=0,maxx=-1,minn=1e9;
cin>>n>>k;
for(int i=1,temp;i<=n;i++)
{
cin>>temp;h[temp]++;
maxx=maxx>temp?maxx:temp;
minn=minn<temp?minn:temp;
}
for(int i=maxx;i>=minn;i--)
{
sum[i]=sum[i+1]+h[i];
}
for(int i=maxx;i>=minn;i--)
{
if(tot+sum[i]>k)
{
ans++;
tot=0;
}
tot+=sum[i];
}
if(tot>n)
ans++;
cout<<ans<<endl;
return 0;
}