题解 CF1065C 【Make It Equal】

可不是个水题嘛!


目录

  • 引入
  • 思路
  • 优化
  • 吐槽
  • 代码
  • Over

引入

暴力出奇迹,骗分过样例。 数学先打表,DP看运气。

穷举TLE,递推UKE。 模拟MLE,贪心还CE。

想要骗到分,就要有方法。 图论背模板,数论背公式。

动规背方程,高精背代码。 如果都没背,干脆输样例。


思路

如引入所述,此题可以暴力,将楼层一层一层往下消,消的过程中记录答案。如果初始值已经不用更改,直接特判,输出0即可(更多注释见代码)!

暴力真是个好办法,但是我们应该考虑是否会超时。

经过本蒟蒻的验证,这是不会超时的。


优化

求个前缀和,差分一把,它不香么?


吐槽

原来的紫题,怎么就变成驴踢绿题了?

感谢良心的翻译官,将题目翻译的如此简练!


代码

#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+1;
int a[MAXN],pre[MAXN],num[MAXN];
int main()
{
    int n,m;
    cin>>n>>m;
    int i;
    int Biggest=-1,Smallest=0x7ffffff;
    for(i=1;i<=n;i++)//输入并为特判做准备
    {
        cin>>a[i];
        Biggest=max(Biggest,a[i]);
        Smallest=min(Smallest,a[i]);
        num[a[i]-1]++;
    }
    if(Biggest==Smallest)//特判
    {
        cout<<0<<endl;
        return 0;
    }
    for(i=Biggest-1;i>=Smallest;i--)//前缀和优化
    {
        pre[i]=pre[i+1]+num[i];
    }
    int ans=1;
    int now=0;
    for(i=Biggest;i>=Smallest;i--)//暴力枚举,将层数往下消。
    {
        now+=pre[i];//加上这一层的楼房数
        if(now>m)
        {
            now=pre[i];
            ans++;//更新答案
        }
    }
    cout<<ans<<endl;//输出答案
    return 0;
}
View Code

Over

点个赞再走吧!

posted @ 2020-08-08 15:16  Bushuai_Tang  阅读(112)  评论(0编辑  收藏  举报