前提
<追記>
実は、以下(リンク)のダーツ問題と向き合っています。
リンク
下記のプログラムの10~14行目で行われていることを目で見たいです。
入力と出力は以下です。
〇入力
4 50 3 14 15 9
〇出力
0 3 3 6 48
繰り返しのあとの配列Sを見てもなぜ入力データを足して配列に入れていくだけなのにこの出力になるのか理解に苦しんでいます。
また、for文のなかの追い方も出力したいのですが、方法が見つからずといった具合です。
該当のソースコード
C++
1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 long long N, M; 6 cin >> N >> M; 7 vector<long long> P(N); 8 for (int i = 0; i < N; ++i) cin >> P[i]; 9 P.push_back(0); 10 vector<long long> S; 11 for (int i = 0; i < P.size(); ++i) 12 for (int j = 0; j < P.size(); ++j) 13 S.push_back(P[i] + P[j]); 14 sort(S.begin(), S.end()); 15 16 for(int i=0;i<N;++i){ 17 cout << S[i] << endl; 18 } 19 20 21 22 long long res = 0; 23 for (long long a : S) { 24 auto it = upper_bound(S.begin(), S.end(), M-a); 25 if (it == S.begin()) continue; 26 --it; 27 res = max(res, a + *it); 28 } 29 cout << res << endl; 30}
試したこと
- 配列Sの出力・・・中を見ればわかると思ったため。
- push_backの意味・・・配列に挿入するコマンド
補足情報(FW/ツールのバージョンなど)
・for文の中のi、jの推移と**S.push_back(P[i] + P[j]);**の過程の見方など細かいことでも構いません。ご指導、お願いしたいです。
> 引用テキスト配列Sを見てもなぜ入力データを足して配列に入れていくだけなのにこの出力になるのか
ではどのような出力になると想像していますか?
色々と処理の見落としがあるように思えます。
そうですね…コードを追ってみた限り想像していた処理と見当違いの方向に進んで行っているように見えます。(そもそもSの要素数はP^2になるのにN個しか表示してない時点で想定通りの仕様ではないと推察されます)
例として、自分が出力されると思った結果を提示していただけませんか?それによって回答が変わってきますので…
とりあえず、なんでそういう出力になったかは見当ついたのでそちらだけ回答しておきますね。
ご回答ありがとうございました。
追加の質問になってしまうのですが、したのfor文の「it」も出力させたいと思い、以下のプログラムを組んでみたところ演算子のエラー?が出てきてしまいました。
long long res = 0;
for (long long a : S) {
cout <<"a=" << a << endl;
auto it = upper_bound(S.begin(), S.end(), M-a);
cout << "it=" << it << endl;
if (it == S.begin()) continue;
--it;
res = max(res, a + *it);
}
%%d的なものが必要なのでしょうか...
何かコメント頂けると幸いです。
返信遅れました。もう解決してるかもしれませんがコメントしときます
upper_bound関数の返り値はイテレータです。なのでITの中身を出力させたいなら*itにする必要があります
このサイトとかわかりやすいと思いますので共有しときますね
https://qiita.com/ganyariya/items/33f1326154b85db465c3
すみません、丁寧にありがとうございます。確認してみます!

回答4件
あなたの回答
tips
プレビュー