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

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

新規登録して質問してみよう
ただいま回答率
85.50%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

6019閲覧

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

hon.ki

総合スコア157

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

0クリップ

投稿2019/01/17 11:46

コード //入力 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を使っています。

bochan2👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

C++

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

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

C++

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

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

C++

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

バグの特定

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

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

C++

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

出力 Wandbox

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

文言が違いますね。


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

error: no matching function for call to 'max'

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

C++

1void func(int, int); 2 3int main() { 4 func(42); 5}

出力 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 11:57

編集2019/01/17 12:15
LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hon.ki

2019/01/17 12:32

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問