実現したいこと
二分探索のプログラムを正しいものに変更したいです。
発生している問題・分からないこと
AtCoderの以下の問題を解いていて、二分探索を使えばよいのは分かったのですが、その実装が上手くできません。
https://atcoder.jp/contests/abc388/tasks/abc388_c
下記に示すコードを書くとサンプルは正しく処理できるのですが、提出時のテストで誤答が発生していしまいます。
i番目の要素について、その値の半分以下の要素がいくつあるかを数えるために二分探索を利用していますが、この実装がおかしいのでしょうか?
ご回答、よろしくお願いします。
該当のソースコード
C言語
1#include <stdio.h> 2#define MAX 500000 3 4int main(void){ 5 int i, c, N, high, low, mid; 6 int kagamimochi[MAX] = {0}; 7 8 //総数Nの読み込み 9 scanf("%d", &N); 10 11 //N個の鏡餅の読みこみ 12 for(i = 0; i < N; i++){ 13 scanf("%d", &kagamimochi[i]); 14 } 15 16 c = 0; 17 18 for(i = 0; i < N; i++){ 19 high = i; 20 low = 0; 21 22 //i番目の鏡餅の上に載せられる餅は何パターンあるかの探索 23 while(low<=high){ 24 mid = (low + high) / 2; 25 26 if((kagamimochi[mid] * 2) <= kagamimochi[i]){ 27 low = mid + 1; 28 } 29 else{ 30 high = mid - 1; 31 } 32 } 33 //デバッグ用 34 //printf("i:%d low:%d mid:%d high:%d\n", i, low, mid, high); 35 36 c += low; 37 } 38 39 printf("%d\n", c); 40 41 return 0; 42}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
以下のサイトで二分探索のコードを参考にしました。
https://dev.mescius.jp/support/powernews/column/clang/054/page03.htm
今回は、「ある値が見つかるかどうか」ではなく「ある値の半分以下となる場所がどこになるか」が知りたいことだと考えたので、値が見つかればループを抜けるような構造にはしませんでした。
その結果、上記の問題が発生しています。
補足
特になし
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2025/01/12 06:56