C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でN個のクラッカーをK人に分配したときの最大値と最小値の差の最小値を求める

この記事では、2つの整数 NK が与えられたとき、N個のクラッカーをK人のユーザーに分配する問題を解説します。目標は、あるユーザーが受け取るクラッカーの最大数と、別のユーザーが受け取る最小数の差として考えられる最小値を求めることです。

問題の例

たとえば、入力が N = 7、K = 3 の場合を考えてみましょう。このとき出力は 1 になります。なぜなら、各ユーザーがそれぞれ 2個・2個・3個 のクラッカーを受け取るとき、最大数(3個)と最小数(2個)の差は 1 になるからです。

解法のアプローチ

この問題は非常にシンプルな論理で解くことができます。

  • N が K で割り切れる場合:全員が同じ個数(N ÷ K 個)を受け取れるため、最大と最小の差は 0 になります。
  • N が K で割り切れない場合:どう分配しても、一部のユーザーが他より1個多く受け取ることになり、差は最低でも 1 になります。

つまり、アルゴリズムは次のようにまとめられます。

if n mod k is same as 0, then:
    return 0
Otherwise
    return 1

C++での実装例

理解を深めるために、以下の実装を見てみましょう。

#include <bits/stdc++.h>
using namespace std;

int solve(int n, int k){
    if (n % k == 0){
        return 0;
    } else{
        return 1;
    }
}
int main(){
    int N = 7;
    int K = 3;
    cout << solve(N, K) << endl;
}

入力

7, 3

出力

1

計算量について

この解法は剰余演算を1回行うだけで済むため、時間計算量は O(1)、空間計算量も O(1) となります。どれほど大きな N や K が与えられても、即座に答えを導き出せる効率的なアルゴリズムです。

  1. C++で円を2つの部分に分割したときの角度差の最小値を求めるプログラム

    この記事では、円を構成する各部分(扇形)の角度が格納された配列が与えられたとき、それらを連続的につなぎ合わせて2つの部分に分割した場合の角度差の最小値を求めるC++プログラムを解説します。問題の概要円全体(360度)を構成するすべての部分の角度が配列として与えられます。これらの部分を連続する範囲ごとに結合して2つのグループを作り、それぞれのグループの角度の合計の差が最小になるようにします。重要なのは、離れた位置にある部分(例えば最初の部分と3番目の部分など)を一緒にすることはできないという点です。入力例で理解しましょう入力ang[] = {90, 45, 90, 135}出力90説明1つ目と2

  2. C++プログラムにおける「struct」と「typedef struct」の違いとは?

    「struct」と「typedef struct」の基本的な違い基本的に、structは構造体を定義するために使用されるキーワードです。しかし、C言語では、定義した構造体を実際に使用する際に、必ずstructキーワードを付けて記述する必要があります。一方、typedefキーワードを組み合わせて使用すると、構造体に新しい別名(型名)を与えることができます。これにより、以降はその名前だけで構造体を利用でき、いちいちstructキーワードを書く必要がなくなります。C言語での記述例// structのみを使用する場合 struct Point { int x; int y; }; s