题解:P15007 [UOI 2019 II Stage] 草坪
为表述方便,题目中的小时在本文中用“次”表示。
显然,为了让修剪次数尽可能少,我们应该让每次修剪的区间尽可能不相交。然而这样的话,可能会剩下一些草坪没有修剪,这时候我们就需要再修剪一次。为了只再修剪一次,我们应该让没有修剪的部分集中在一起。
因此,可以得到次数为
但如果这样你交上去只能得
该子段完全被草覆盖
这一句不起眼的话上。
我们举一个例子:
但这种情况只在剪一次就没法再剪了的时候出现,比如
所以第一种情况的公式不变,但只适用于剪了第一次还能再剪至少一次,或恰好需要剪一次时。第二种情况由于只在剪一次就没法再剪了的时候出现,所以只需要剪一次,等一次,再剪一次,直接输出
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ft first
#define sd second
#define fs(i,x,y) for(int i=(x);i<=(y);i++)
#define fj(i,x,y) for(int i=(x);i>=(y);i--)
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,k;
cin>>n>>k;
if(n/k==1&&n%k!=0)cout<<3;
else cout<<ceil(n*1.0/k);
return 0;
}
结尾
数学题就是这样,讲着费劲,但写代码简单。