質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.10%

C++で競技プログラミング、main関数の書き方でmax()の定義について、コンパイルエラーの解決方法

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,672

hon.ki

score 24

コード
//入力
int n, a[MAX_N];
void solve(){
  int ans = 0; //答え

  //棒を重複して選ばないように、i<j<kとなるようにしている。
  for (int i = 0; i < n; i++){
      for(int j = i + 1; j < n; j++){
          for (int k = j+1; k < n; k++){
              int len = a[i] + a[j] + a[k]; //周長
              int ma = max(a[i], max([a[j], a[k]]));//もっとも長い棒の長さ
              int rest = len - ma;

              if (ma < rest){
                  //三角形が作れるので、答えを更新できれば更新
                  ans = max(ans, len);
              }
          }
      }
  }
  //出力
  printf("%d\n", ans);
}


上記のコードは、プログラミングコンテストの参考書に載っていたもので、便宜的に入力が全てmain関数で読み込まれてグローバル変数に置かれたのち、関数solveが呼ばれることによって問題を解く形式で書かれています。

当の問題ですが、以下のようなものです。
<問題>
n本の棒があります。棒iの長さはa_iです。あなたは、それらの棒から3本を選んで、できるだけ酋長の長い三角形を作ろうと考えています。最大の周長を求めなさい。ただし、三角形が作れない場合には0を答えとしなさい。
<制約>3 <= n <= 100, 1 <= a_i <= 10**6
<例1> 
<入力>n = 5
a = {2, 3, 4, 5, 10}
<出力>12(3, 4, 5の棒を選んだ)
<例2>
<入力>n = 4
a = {4, 5, 10, 20}
<出力>0(どれを選んでも三角形は作れない)

これを、ローカル環境で実行できる形に直そうとしたのが、以下のコードです。

コード
//入力
#include <cstdio>
#include<algorithm>
using namespace std;
const int MAX_N = 100;
int main()
{
    int n, a[MAX_N];
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }

    int ans = 0; //答え

    //棒を重複して選ばないように、i < j < kとなるようにしている
    for (int i = 0; i < n; i++)
    {
        for (int j = i + 1; j < n; j++)
        {
            for (int k = j + 1; k < n; k++)
            {
                int len = a[i] + a[j] + a[k];
                int ma = max(a[i], max(a[j] + a[k]));
                int rest = len - ma;

                if (ma < rest)
                {
                    //三角形が作れるので、答えを更新できれば更新
                    ans = max(ans, len);
                }
            }
        }
    }
    printf("%d\n", ans);

    return 0;
}


test16.cpp:25:36: error: no matching function for call to 'max'
int ma = max(a[i], max(a[j] + a[k]));
^~~
/Library/Developer/CommandLineTools/usr/include/c++/v1/algorithm:2709:1: note: candidate function template
not viable: requires 3 arguments, but 1 was provided
max(const _Tp& a, const _Tp& b, _Compare comp) ^ /Library/Developer/CommandLineTools/usr/include/c++/v1/algorithm:2717:1: note: candidate function template not viable: requires 2 arguments, but 1 was provided max(const _Tp& a, const _Tp& __b)
^
1 error generated.
と表示され、どうやらmaxという関数が定義されていないことが問題らしいのですが、
どう直せば実行できるのかどうしても分かりません。教えていただければ幸いです。
どうぞよろしくお願いいたします。
なお、ローカル環境とは、mac OS High Sierra10.13.6
コンパイラは
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
になります。VSCodeを使っています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+7

int ma = max(a[i], max(a[j] + a[k]));

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

int ma = max(a[i], max(a[j], a[k]));

複数要素を引数に取らないと最大値の求めようが無いのでは。
なお、次のようにinitializer_listを利用しても良いように思います。std::max

int ma = max({a[i], a[j], a[k]});

バグの特定

どうやらmaxという関数が定義されていないことが問題らしい

その仮説を確かめるために、エラーの再現を試みると良いです。

int main() {
    ghost_func(1, 2);
}

出力 Wandbox

prog.cc:2:5: error: use of undeclared identifier 'ghost_func'
    ghost_func(1, 2);
    ^

文言が違いますね。


ここで改めてエラーメッセージを良く見てみましょう。

error: no matching function for call to 'max'

『適合する関数が無い』と言っているだけで、『存在しない』とは言っていないです。
そうすると、自然に引数の与え方に目が行きます。

void func(int, int);

int main() {
    func(42);
}

出力 Wandbox

prog.cc:4:5: error: no matching function for call to 'func'
    func(42);
    ^~~~
prog.cc:1:6: note: candidate function not viable: requires 2 arguments, but 1 was provided
void func(int, int);

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/17 21:32

    指摘いただいた箇所を直したところ、無事動きました。また、バグの特定方法についても言及してくださり、とてもためになりました。エラーの再現を試みてみたことはなかったので、これからは心がけていきたいです。本当に、ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • C++に関する質問
  • C++で競技プログラミング、main関数の書き方でmax()の定義について、コンパイルエラーの解決方法