前提・実現したいこと
AtCoder 三井住友信託銀行プログラミングコンテスト2019 D問題についての質問です。
問題文のURLは以下です。
D - Lucky PIN
0から999まで全探索をすれば解けることがわかりましたが、以下のようなコードを書いてTLEが出てしまいました。isContainPIN()を使えば以下のようなTLEが出力され、解説を見て、試しに以下のisContainPIN2()関数を作成し、これを使えばACとなりました。
考え方は同じように書いたつもりでしたが、どこでこのような違いが発生してしまっているのでしょうか。
お教え頂ければ幸いです。よろしくお願いいたします。
発生している問題・エラーメッセージ
該当のソースコード
c++
1#include <bits/stdc++.h> 2#define REP(i, n) for (int i = 0; (i) < (int)(n); ++ (i)) 3#define REP3(i, m, n) for (int i = (m); (i) < (int)(n); ++ (i)) 4using namespace std; 5 6bool isContainPIN(int64_t first,int64_t second, int64_t third , int64_t n, string s){ 7 REP(i, n - 2){ 8 if(s[i] - '0'== first){ 9 REP3(j, i + 1 ,n - 1){ 10 if(s[j] - '0' == second){ 11 REP3(k, j + 1, n){ 12 if(s[k] - '0' == third){ 13 return true; 14 } 15 } 16 } 17 } 18 } 19 } 20 return false; 21} 22 23bool isContainPIN2(int64_t first,int64_t second, int64_t third , int64_t n, string s){ 24 int64_t c[3] = {first, second, third}; 25 int64_t f = 0; 26 REP(i, n){ 27 if(s[i] - '0'== c[f])f++; 28 if(f == 3) return true; 29 } 30 return false; 31} 32 33int64_t solve(int64_t n, string s) { 34 int64_t ans = 0; 35 REP(i, 10){ 36 REP(j, 10){ 37 REP(k, 10){ 38 if(isContainPIN(i, j, k, n, s))ans++; 39 } 40 } 41 } 42 return ans; 43} 44 45int main() { 46 int64_t N; 47 string S; 48 cin >> N >> S; 49 auto ans = solve(N, S); 50 cout << ans << endl; 51 return 0; 52}
試したこと
上記のように、2つのisContainPIN関数を用意し、比較を行いました。明らかに実行速度に差が出ているのがわかり、アルゴリズムが違うのだと推測します。
補足情報(FW/ツールのバージョンなど)
特にありません。
共有する情報が不足している等ございましたら、ご指摘いただけると幸いです。よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/24 07:38