【算法】放货物

题目描述

小明是一名快递员,他现在手上一共有N个快件需要运送。但是货车有限,所以我们希望用最少的货车来进行工作。现在已知,一辆车的限定额度为最多放置K件货物。此外,小明很不喜欢13这个数字,所以他不希望任何一辆货车中的货物数量为13。 现在小明想要知道,最少使用多少辆货车能够将这N个快件都放置到货车上。

输入描述:

题目包含多组输入,每一组输入一行两个数,分别表示N 和 K 1<=N<=1000 1<=K<=1000

输出描述:

输出一行一个数字,表示最优结果。

示例

输入

13 13
5 2

输出

2
3

分析

从题可知,要想让使用的货车数量最少,则应尽量将货车装满。由于货车不能装13件货物,但可以装大于或者小于13件货物,所以可以将输入的K(货车最大放置货物数)分为三种情况:
1、K < 13:无需考虑货物装13件货物的情况,即货车的最大满载量就是K,此时使用最少货车数量应该是:货物总量 / 货车最大满载量,且如果货物总量 / 货车最大满载量有余数则还需要再加一辆货车,如果没有余数则不需要再加货车。
2、K == 13:需要考虑货物装13件货物的情况,此时货车的最大满载量应该是12,则使用最少货车数量应该是:货物总量 / 12,且如果货物总量 / 12有余数则还需要再加一辆货车,如果没有余数则不需要再加货车。
3、K > 13:需要考虑货物装13件货物的情况,此时货车的最大满载量就是K,则使用最少货车数量应该是:货物总量 / 货车最大满载量,且如果货物总量 / 货车最大满载量有余数则还需要再加一辆货车,如果没有余数则不需要再加货车,如果该余数刚好是13,则还需要再加一辆车,即将这最后余下的分到两辆车。

参考代码

C语言实现

#include <stdio.h>

int solution(int N, int K) {
    int result;
    // TODO: 请在此编写代码
    if (K < 13) {
        result = N / K + (N % K > 0);
    } else if (K == 13) {
        result = N / 12 + (N % 12 > 0);
    } else if (K > 13) {
        result = N / K;
        if (N % K > 0) {
            result += 1;
            if (N % K == 13) {
                result += 1;
            }
        }
    } 
    return result;
}

int main() {
    int n, k;
    while (scanf("%d %d", &n, &k) != EOF)
    {
        int result;
        result = solution(n, k);
        printf("%d\n", result);
    }
    return 0;
}