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

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

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

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

C++

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

Q&A

解決済

2回答

1706閲覧

AtCoder ABC 079 C - Train Ticket でWA

kei0105

総合スコア7

アルゴリズム

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

C++

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

0グッド

1クリップ

投稿2020/12/05 12:14

編集2020/12/06 05:11

AtCoder ABC 079 C - Train Ticket でWA

AtCoder ABC 079 C - Train Ticketにて、WA(不正解)となってしまう(コードテストはうまくいく)ため質問します。
以下の実装コードではどのように間違っているのでしょうか。
※愚直にifで試すのではなくbit全探索をしたい。

問題:https://atcoder.jp/contests/abc079/tasks/abc079_c

実装コード

c++

1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 vector<int> ticket(4); 6 7 for(int i = 0; i < 4; i++){ 8 cin >> ticket[i]; 9 } 10 11 for(int bit = 0; bit < (1 << 3); bit++){ 12 int ans = 0; 13 14 for(int idx = 0; idx < 3; idx++){ 15 if(bit & (1 << idx)) ans += ticket[idx + 1]; 16 17 else ans -= ticket[idx + 1]; 18 } 19 20 if(ans == 7){ 21 cout << ticket[0]; 22 23 for(int idx = 0; idx < 3; idx++){ 24 if(bit & (1 << idx)) cout << '+'; 25 else cout << '-'; 26 27 cout << ticket[idx + 1]; 28 } 29 30 cout << "=7" << endl; 31 32 } 33 } 34} 35

#修正後

#include <bits/stdc++.h> using namespace std; int main() { int abcd; cin >> abcd; vector<int> ticket(4); for(int i = 3; i > -1; i--){ ticket[i] = (abcd%10); // 1桁取り出していく abcd /= 10; } for(int bit = 0; bit < (1 << 3); bit++){ int ans = ticket[0]; for(int idx = 0; idx < 3; idx++){ if(bit & (1 << idx)) ans += ticket[idx + 1]; else ans -= ticket[idx + 1]; } if(ans == 7){ cout << ticket[0]; for(int idx = 0; idx < 3; idx++){ if(bit & (1 << idx)) cout << '+'; else cout << '-'; cout << ticket[idx + 1]; } cout << "=7" << endl; } } }

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

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

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

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

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

guest

回答2

0

すべての場合の計算結果を表にしておけば速いのではないかな、と思って書いてみました。

C

1#include <stdio.h> 2 3#define D(a,b,c,d) a+b+c+d,a+b+c-d,a+b-c+d,a+b-c-d,\ 4 a-b+c+d,a-b+c-d,a-b-c+d,a-b-c-d 5#define C(a,b,c) D(a,b,c,0),D(a,b,c,1),D(a,b,c,2),D(a,b,c,3),D(a,b,c,4),\ 6 D(a,b,c,5),D(a,b,c,6),D(a,b,c,7),D(a,b,c,8),D(a,b,c,9) 7#define B(a,b) C(a,b,0),C(a,b,1),C(a,b,2),C(a,b,3),C(a,b,4),\ 8 C(a,b,5),C(a,b,6),C(a,b,7),C(a,b,8),C(a,b,9) 9#define A(a) B(a,0),B(a,1),B(a,2),B(a,3),B(a,4),\ 10 B(a,5),B(a,6),B(a,7),B(a,8),B(a,9) 11 12int t[80000] = { A(0),A(1),A(2),A(3),A(4),A(5),A(6),A(7),A(8),A(9) }; 13 14void print(int i, const int *s) 15{ 16 static const char *fmt[8] = { 17 "%d+%d+%d+%d=7\n", "%d+%d+%d-%d=7\n", "%d+%d-%d+%d=7\n", "%d+%d-%d-%d=7\n", 18 "%d-%d+%d+%d=7\n", "%d-%d+%d-%d=7\n", "%d-%d-%d+%d=7\n", "%d-%d-%d-%d=7\n" 19 }; 20 printf(fmt[i], s[0], s[1], s[2], s[3]); 21} 22 23int main(void) 24{ 25 int s[4]; 26 scanf("%1d%1d%1d%1d", s, s+1, s+2, s+3); 27 int n = (s[0]*1000 + s[1]*100 + s[2]*10 + s[3]) * 8; 28 for (int i = 0; i < 8; i++) 29 if (t[n + i] == 7) { print(i, s); break; } 30}

投稿2020/12/06 08:52

編集2020/12/06 09:05
kazuma-s

総合スコア8224

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

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

0

ベストアンサー

以下の実装コードではどのように間違っているのでしょうか。

入力が 1222 の場合、それが ticket[0] に入り、
ticket[1]~ticket[3] への入力待ちとなります。

計算の方は、ticket[0] の値が使用されず、
ticket[1]~ticket[3] の値だけで計算しています。

投稿2020/12/05 15:30

kazuma-s

総合スコア8224

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

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

kei0105

2020/12/06 05:08

入力部分を ``` int abcd; cin >> abcd; vector<int> ticket(4); for(int i = 3; i > -1; i--){ ticket[i] = (abcd%10); // 1桁取り出していく abcd /= 10; } ``` 計算部分にticket[0]を挿入 ``` int ans = ticket[0]; ``` 以上のように変更しましたがテストケースによってはうまく行きませんでした。 どのように問題でしょうか。
kazuma-s

2020/12/06 07:29

答えが複数存在する場合に全部出力しているからではありませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問