//入力 int n, m, k[MAX_N] bool binary_search(int x) { //xの存在し得る範囲はk[l], k[l+1], ....k[r-1] int l = 0; r = n; //範囲に何も含まれなくなるませ繰り返す while (r - l >= 1) { int i = (l + r) / 2; if (k[i] == x) return true; //見つかった else if (k[i] < x) l = i + 1; else r = i; } //見つからなかった return false; } void solve() { sort(k, k + n); bool f = false; for (int a = 0; a < n; a++) { for (int b = 0; b < n; b++) { for (int c = 0; c < n; c++) { if (binary_search(m - k[a] - k[b] - k[c])) f = true; } } } } if (f) puts("Yes"); else puts("No"); } ```上記のコードは、プログラミングコンテストの参考書に載っていたもので、便宜的に入力が全てmain関数で読み込まれてグローバル変数に置かれたのち、関数solveが呼ばれることによって問題を解く形式で書かれています。 当の問題ですが、以下のようなものです。 <問題> あなたの友人は次のようなゲームをあなたに仕掛けてきました。数字が書かれたn舞の紙切れが袋に入っています。あなたはこの袋から紙切れを取り出し、数字を見て袋に戻すということを4回行い、4回の紙切れの数字を和がmになっていればあなたの勝ち、そうでなければ友人の勝ちになります。あなたはこのゲームに何度か挑戦しましたが、一度も勝つことができませんでした。怒ったあなたは袋を破り、滑れの紙切れを取り出して本当に勝つ可能性があるのかを調べることにしました。紙切れに書かれている数字がk1,k2,...knであったとき、和がmになる取り出し方が存在するかどうかを計算し、存在するならYes, 存在しないならNoと出力するプログラムを書きなさい。 <制約>1 <= n <= 50, 1 <= m <= 10**8(10の8乗), 1<= k_i <= 10**8(10の8乗) <例1> <入力>n = 3 m = 10 k = {1, 3, 5} <出力>Yes(例えば1,1,3,5のように出れば、和が10になる) <例2> <入力>n = 3 m = 9 a = {1, 3, 5} <出力>No(和が9になるような出方は存在しない) これを、ローカル環境で実行できる形に直そうとしたのが、以下のコードです。 ```ここに言語を入力 コード #include <cstdio> #include <algorithm> using namespace std; const int MAX_N = 50; int n, m, k[MAX_N]; //入力 bool binary_search(int x) { //xの存在し得る範囲はk[1], .... , k[r-1] int l = 0, r = n; //範囲に何も含まれなくなるまで繰り返す while (r - 1 >= 1) { int i = (1 + r) / 2; if (k[i] == x) return true; //見つかった else if (k[i] < x) l = i + 1; else r = i; } //見つからなかった return false; } void solve() { //二分探索をするためにソート sort(k, k + n); bool f = false; for (int a = 0; a < n; a++) { printf("a"); for (int b = 0; b < n; b++) { for (int c = 0; c < n; c++) { //もっとも内側のループの代わりに二分探索 if (binary_search(m - k[a] - k[b] - k[c])) { f = true; } } } } if (f) puts("Yes"); else puts("No"); } int main() { scanf("%d", &n); scanf("%d", &m); for (int i = 0; i < n; i++) { scanf("%d", &k[i]); } solve(); return 0; }
これを実行すると、指定の入力を与えても、入力待ち状態が終了しない状態が続いてしまいます。おそらく入力を受け取る処理を間違えているのだと思いますが、どう直せば良いのかどうしても分かりません。ご教授いただけますと幸いです。
どうぞよろしくお願いいたします。
なお、ローカル環境とは、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を使っています。
また、蛇足ながら、エラーの再現を試みようと、
コード #include<cstdio> int main() { int k[10]; int n; scanf("%d", &n); for (int i = 0;i <n; i++) { scanf("%d", &k[n]); } for (int i = 0; i <n;i++) { printf("%d", k[i]); } return 0; }
というコードで、
4
1 2 3 4という入力に対して、
1234という出力を期待したのですが、出力されたのは0000でした。これは何故なのでしょうか。合わせてご教授いただけますと、幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/18 15:29
2019/01/18 15:30
2019/01/18 15:45
2019/01/19 01:05
2019/01/19 01:16