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

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

新規登録して質問してみよう
ただいま回答率
85.34%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

146閲覧

二分探索の実装が上手くできません

IMR

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2025/01/12 04:05

実現したいこと

二分探索のプログラムを正しいものに変更したいです。

発生している問題・分からないこと

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
今回は、「ある値が見つかるかどうか」ではなく「ある値の半分以下となる場所がどこになるか」が知りたいことだと考えたので、値が見つかればループを抜けるような構造にはしませんでした。
その結果、上記の問題が発生しています。

補足

特になし

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

公式の解説に以下のように書かれています。

答えが 32bit 整数に収まらない大きさになる場合があることに注意してください。

つまり、答えを保存するcの型は、32bitのintだと足りないのです。
(cの型を変えた場合、printfによる表示部分も修正が必要なので注意してください)

投稿2025/01/12 05:57

actorbug

総合スコア2460

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

IMR

2025/01/12 06:56

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。 ご指摘の通り、答えを保存する変数の型にまで意識が向けていられませんでした。 気づかせてくださりありがとうございます! printfに関する注意事項もご丁寧にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問