题解:P15007 [UOI 2019 II Stage] 草坪

· · 题解

题目大意

有一段长为 n 米的草坪,每一次可以选取 k 米的一段连续的草坪剪掉,问要剪多少次可以使所有草坪至少剪过一次。

题目分析

step 1

正常来讲,每次剪掉 k 米问多少次剪掉 n 米,直接分类讨论不就行了吗?于是我先是信心满满地写下了以下代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int n,k;
    cin >> n >> k;
    if (n % k == 0) cout << n / k;
    else cout << n / k + 1;
    return 0;
}

发现WA了 6 个点。

step 2

后来我想到,当 n2k 要小的时候,第 2 次剪的就不全是被草覆盖的,还得再等 1 小时才能剪第 2 次,所以一共需要 3 小时。于是我再次写下代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int n,k;
    cin >> n >> k;
    if (k * 2 > n) cout << 3;
    else if (n % k == 0) cout << n / k;
    else cout << n / k + 1;
    return 0;
}

发现WA了 3 个点。

step 3

我又想到,当 k = n 时剪 1 次就可以了,所以还要特判一下才行。

最终,我耗时 15 分钟终于AC了这道题:

#include <bits/stdc++.h>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int n,k;
    cin >> n >> k;
    if (k * 2 > n and k != n) cout << 3;
    else if (n % k == 0) cout << n / k;
    else cout << n / k + 1;
    return 0;
}