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

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

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

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

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Q&A

解決済

1回答

557閲覧

atcoderの問題で、原因不明のエラー

shamsham

総合スコア38

C

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

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

0グッド

0クリップ

投稿2022/09/26 06:55

前提

atcoderの問題で、バグが発生しましたが、原因がつかめていません。

実現したいこと

バグの原因を突き止める。

発生している問題・エラーメッセージ

イメージ説明

該当のソースコード

c

1ソースコード 2#include<stdio.h> 3 4int max_kohuku(int a,int b,int c);//3つの中から最大を返す 5int second_kohuku(int a,int b,int c);//3つの中から2番目に大きい数を返す 6 7int main(){ 8 int N; 9 int kohuku[100010][3];//i日目の行動jをした時の幸福度はkohuku[i][j] 10 int sum_kohuku[100010][2];//i日目に行動jをしたときにそれを含めた最大の幸福度はsum_kohuku[i][j] 11 int sss; 12 sss = scanf("%d",&N); 13 for(int i = 0;i < N;i++){ 14 sss = scanf("%d %d %d",&kohuku[i][0],&kohuku[i][1],&kohuku[i][2]); 15 sum_kohuku[i][0] = -1;//初期化 16 sum_kohuku[i][1] = -1;//初期化 17 } 18 19 sum_kohuku[0][1] = max_kohuku(kohuku[0][0],kohuku[0][1],kohuku[0][2]); 20 sum_kohuku[0][0] = second_kohuku(kohuku[1][0],kohuku[1][1],kohuku[1][2]); 21 for(int i = 1;i < N;i++){ 22 sum_kohuku[i][1] = max_kohuku(kohuku[i][0],kohuku[i][1],kohuku[i][2]) + sum_kohuku[i-1][0]; 23 sum_kohuku[i][0] = second_kohuku(kohuku[i][0],kohuku[i][1],kohuku[i][2]) + sum_kohuku[i-1][1]; 24 } 25 int pri; 26 if(sum_kohuku[N-1][0] > sum_kohuku[N-1][1]){ 27 pri = sum_kohuku[N-1][0]; 28 }else{ 29 pri = sum_kohuku[N-1][1]; 30 } 31 printf("%d",pri); 32 return 0; 33} 34 35int max_kohuku(int a,int b,int c){ 36 int ret = a; 37 if(ret < b){ 38 ret = b; 39 } 40 if(ret < c){ 41 ret = c; 42 } 43 return ret; 44} 45 46int second_kohuku(int a,int b,int c){ 47 int ret = a; 48 if(ret == max_kohuku(a,b,c)){ 49 ret = b; 50 } 51 if((ret < b) && b != max_kohuku(a,b,c)){ 52 ret = b; 53 } 54 if((ret < c) && c != max_kohuku(a,b,c)){ 55 ret = c; 56 } 57 return ret; 58}

試したこと

まず、前に質問した時にscanfの返り値にsssをつけずに、(void)scanfとすればいいと教えてくださった方がいたのですが、atcoderのシステムの関係なのか、それでもバグが出たので返り値をつけさせていただきました。

変数のオーバーフローかと思ってkohuku,sum_kohukuの要素を5倍くらいに増やしたのですが、実行結果は変わりませんでした。

自分の環境で、サンプルを入力すると正しく動作します。

補足情報(FW/ツールのバージョンなど)

問題のURLです
https://atcoder.jp/contests/dp/tasks/dp_c
もし、ほかに必要な情報があれば教えてください。
回答よろしくお願いします。

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

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

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

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

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

int32_t

2022/09/26 07:25

どういう入力で問題が出るかはわからないのですか?
jimbe

2022/09/27 04:11

scanf の返り値を受け取っているかどうかだけで異常動作というのは考えられません。 (atcoder の他の問題でそのようなことは聞いたことが無いと思います。)
shamsham

2022/09/27 17:09

int32_tさん、コメントありがとうございます。 私の知る限りでは、どの入力でエラーするのかわかりません。
guest

回答1

0

ベストアンサー

text

13 21 2 3 31 3 2 41 2 3

なる入力を与えると、C, B, C で 9になるべきですが、質問文のコードでは8になります。
おそらくロジックを間違えているかと思います

sum_kohuku[i][0]
(0日目で一番目に幸福度の高い行動) + (1日目で二番目に幸福度の高い行動) + (2日目で一番目に幸福度の高い行動) + ...
sum_kohuku[i][1]
(0日目で二番目に幸福度の高い行動) + (1日目で一番目に幸福度の高い行動) + (2日目で二番目に幸福度の高い行動) + ...

となっていますが、問題は「同じ行動を連続してはならない」ということであって、「一番目に高い行動を連続してはならない」ではありません

i日目に行動jをしたときの幸福度の総和が取りうる最大値」をdp[i][j]としたら
i+1日目に行動jをしたときの幸福度の総和が取りうる最大値」dp[i+1][j]

dp[i+1][j] = (dp[i][k]、k != jの大きい方) + (i+1 日目の行動 j の幸福度)

投稿2022/09/26 07:54

編集2022/09/26 08:09
ozwk

総合スコア13521

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

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

shamsham

2022/09/27 17:13

なるほど! 確かに言われてみればそうですね。 わかりやすい説明ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問