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

C++でレビュー投票の結果と不確実性を判定するコード

問題の概要

3つの整数 x、y、z が与えられます。あるレビューサイトでは、x 人が賛成票(アップ投票)を、y 人が反対票(ダウン投票)を投じることが確定しており、さらに z 人が投票予定ですが、彼らが賛成票を投じるのか反対票を投じるのかは不明です。各人は最大1回しか投票できません。

賛成票が反対票より多ければ結果は「+」、反対票が多ければ「-」、同数であれば「0」となります。しかし、投票先が不明な z 人が存在するため、結果が1通りに確定しないケースがあります。z 人の投票の仕方に2通り以上の異なるシナリオが存在するとき、結果は不確実(「?」)とみなされます。この問題では、結果を求めるか、不確実であることを報告します。

入力例

x = 2、y = 0、z = 2 の場合を考えてみましょう。すでに賛成票が2票あり、残りの2票がすべて反対票なら結果は「0」になりますが、すべて賛成票なら「+」になります。このように結果が確定しないため、出力は「?」となります。

解法のステップ

この問題は、次の条件分岐で解くことができます。

  • x > y + z の場合: 不明な z 人が全員反対票を投じても賛成票が上回るため、結果は「+」で確定します。
  • x + z < y の場合: 不明な z 人が全員賛成票を投じても反対票が上回るため、結果は「-」で確定します。
  • z = 0 の場合: 投票がすべて確定しており、上記の条件を通過した時点で x = y が成り立つため、結果は「0」です。
  • 上記以外の場合: 不明な票によって結果が変わり得るため、「?」を返します。

C++による実装例

以下は、このロジックをC++で実装した例です。

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

string solve(int x, int y, int z){
if (x > y + z)
return "+";
else if (x + z < y)
return "-";
else if (!z)
return "0";
else
return "?";
}

int main(){
int x = 2;
int y = 0;
int z = 2;
cout << solve(x, y, z) << endl;
}

入力

2, 0, 2

出力

?

計算量

このアルゴリズムは単純な条件分岐のみで構成されているため、時間計算量・空間計算量ともに O(1) で動作します。投票者数がどれほど多くても、定数時間で結果を判定できるのがポイントです。

  1. C++で巨大な数値が2・3・5で割り切れるかを判定する方法

    本記事では、非常に大きな数値が2・3・5のすべてで割り切れるかどうかを判定する方法を解説します。対象となる数は桁数が非常に大きいため、通常の整数型では扱えません。そこで、数値を文字列(string)として受け取り、各桁を調べることで判定を行います。判定の考え方:最小公倍数を使うある数が2・3・5のすべてで割り切れるということは、その数がこれらの最小公倍数(LCM)で割り切れることと同じです。2、3、5の最小公倍数は 30つまり「30で割り切れるか」を判定すればよいさらに、30で割り切れる条件は次のように分解できます。10で割り切れる → 最後の桁(1の位)が「0」である3で割り切れる → 全桁

  2. C++で対角行列・スカラー行列を判定するプログラムの書き方

    行列 M[r][c] が与えられたとき、「r」は行数、「c」は列数を表し、r = c のとき正方行列となります。本記事では、与えられた正方行列が対角行列であるか、スカラー行列であるかを判定し、該当する場合には「yes」を出力する方法を解説します。 対角行列とは 正方行列 m[][] が対角行列であるのは、主対角線以外の要素がすべてゼロである場合、かつその場合に限ります。 下図のように、赤色で示された要素が主対角成分(非ゼロ)であり、それ以外の要素はすべてゼロになっているため、この行列は対角行列です。 入出力例 Input: m[3][3] = { {7, 0, 0}, {0, 8, 0}