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

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

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

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

C++

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

Q&A

解決済

codefestival2015予選A D問題 作成した二分探索のコードが通らない

rdld036
rdld036

総合スコア16

アルゴリズム

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

C++

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

1回答

0グッド

0クリップ

184閲覧

投稿2023/01/31 13:57

前提

atcoder上のこちらの問題についての質問です。下のコードで問題を解こうとしたのですが、すべてACになりません。方針としては解説にある通り、左側の車両を貪欲的に埋めていく方針です。どこに漏れがあるのかご指摘いただけると幸いです。よろしくおねがいします。

該当のソースコード

C++

1#include <bits/stdc++.h> 2 3using namespace std; 4 5typedef long long ll; 6typedef long double ld; 7 8int N, M; 9vector<ll> X; 10 11bool C(ll t){ 12 vector<int> D(M); // 作業員iが担当できる右端の座標 13 for(int i = 0; i < M; ++i){ 14 ll l, r; //l...前の作業員が担当した電車の座標 15 if(i == 0){ 16 l = 0; 17 }else{ 18 l = D[i - 1]; 19 } 20 ll L = X[i] - l - 1; //L...左側への移動距離 21 if(t < L) return false; 22 r = min(X[i + 1] - 1, max(t - 2 * L + X[i], (t - L) / 2 + X[i])); 23 D[i] = r; 24 } 25 return D[M - 1] >= N; 26} 27 28int main(){ 29 ios::sync_with_stdio(false); 30 cin.tie(0); 31 cin >> N >> M; 32 X.resize(M); 33 for(int i = 0; i < M; ++i){ 34 cin >> X[i]; 35 } 36 sort(X.begin(), X.end()); 37 ll lb = -1, ub = 3e10; 38 while(ub - lb > 1){ 39 ll mid = (lb + ub) / 2; 40 if(C(mid)) ub = mid; 41 else lb = mid; 42 } 43 cout << ub << endl; 44}

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

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

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

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

ベストアンサー

c++

1//22行目 2 r = min(X[i + 1] - 1, max(t - 2 * L + X[i], (t - L) / 2 + X[i]));

for文の最終ループではi == M - 1なので、X[i + 1] == X[M]となり、配列外参照をしてしまっています。
i == M - 1の場合はX[i + 1] - 1ではなくNとの最小値を取るか、最小値は取らずにr = max(...);とすればよいです。

あとは、オーバーフローの可能性があるので配列Dの型は一応vector<ll>にしておくと良いでしょう。

投稿2023/01/31 15:59

luuguas

総合スコア464

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

rdld036

2023/02/01 00:39

無事解決できました。ご指摘ありがとうございます。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

アルゴリズム

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

C++

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