SO に関するこのタイトルには多くの質問があることを認識していますが、私が見つけたものはすべて や のようなものi = ++i
でf(f(f(x)))
、どちらもこのコードには含まれていません。これは、これに対するバックトラッキング ソリューションの試みです。私は C の経験がある程度ありますが、C++ を習得しようと試み始めたばかりで、練習のために Codeforces の問題に取り組んでいます。以下のスニペットは、プログラムの本体です。main
は示していませんが、入力と出力を処理します。ここでは、各スタック フレームをできるだけ小さく保つために、 、 、および にweights
グローバルanswer
変数を使用しました。max_depth
solve
問題の原因となっている入力はweights = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
とmax_depth = 1000
です。これを でコンパイルするとg++ std=C++11 file.cpp
、「4 3 2 3 4 3 2 3 4 ... 3 2 1」となり、これが正解です。Codeforces がコンパイルすると、「9 10 9 10 9 10 9 10...」と表示されますが、これは正しくありません。私の推測ではfor(int i : weights)
、ベクトルをトラバースする順序は標準では定義されていませんが、それでも違いが生じる理由はわかりません。私は何が欠けていますか?
#include <iostream>
#include <vector>
#include <sstream>
using namespace std;
string answer = "";
vector<int> weights;
int max_depth;
bool solve(int left_scale, int right_scale, int last_added, int depth){
bool is_left = (depth % 2) == 0;
int new_weight;
int weight_to_inc = is_left ? left_scale : right_scale;
int weight_to_exceed = is_left ? right_scale : left_scale;
if (depth == max_depth){
return true;
}
for(int i : weights){
if (i != last_added){
new_weight = weight_to_inc + i;
if (new_weight > weight_to_exceed){
bool ans = solve(is_left ? new_weight : left_scale,
is_left ? right_scale : new_weight,
i, depth + 1);
if (ans){
stringstream ss;
ss << i;
answer.append(ss.str() + " ");
return true;
}
}
}
}
return false;
}
void start_solve(void){
if (solve(0, 0, 0, 0)){
return;
}
answer = "";
}
(私が提出した完全なコードは、違いがある場合は、ここにあります。)
編集:
Codeforces の問題に対する答えを探して、誰かがこれに出くわした場合: このコードの問題は、「答え」が逆になっていることです。に変更answer.append(ss.str() + " ")
することanswer = ss.str() + answer
は、それを機能させる最短の修正です。