题解 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; }
Over
点个赞再走吧!
不要妄图追上西坠的太阳,而是要在黎明前就等着它!