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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

788閲覧

Atcoder ABC214のC問題でACできない

pbwriter

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/08/14 14:50

前提・実現したいこと

以下のAtcoderの問題について、
(https://atcoder.jp/contests/abc214/tasks/abc214_c)
問題文中のサンプルでは全て正しい答えが導出できたのですが
実際に提出したところ殆どのケースで誤答になってしまいました。

自分ではどこを間違えているのか突き止めることができなかったため、
コード・考え方のミスを指摘していただきたいです。
言語はJava(Open JDK11.0.6)です。

該当のソースコード

Java

1import java.util.*; 2 3 4public class Main { 5 public static void main(String[] args) { 6 Scanner sc = new Scanner(System.in); 7 int n = sc.nextInt(); 8 int[] s = new int[n]; 9 int[] t = new int[n]; 10 int[] ans = new int[n]; 11 12 for(int i = 0;i < n;i++){ 13 s[i] = sc.nextInt(); 14 } 15 for(int j = 0;j < n;j++){ 16 t[j] = sc.nextInt(); 17 } 18 19 for(int k = 0;k < n;k++){ 20 if(k > 0 && t[k] > ans[k - 1] + s[k - 1]){ 21 ans[k] = ans[k - 1] + s[k - 1]; 22 } else if (k == 0 && t[k] > ans[n - 1] + s[n - 1]){ 23 ans[k] = ans[n - 1] + s[n - 1]; 24 } else { 25 ans[k] = t[k]; 26 } 27 } 28 for(int m = 0;m < n;m++){ 29 System.out.println(ans[m]); 30 } 31 } 32}

試したこと

以下のようにサンプルの値を少し変えたところ、

4    
1 2 3 4
8 2 4 7

答えが
4
2
4
7
となってしまい、正解とズレてしまうことは確認しています。
8以外の数値も試してみたところ、5以上では必ず1番目の出力値が
4になってしまうことが分かったのですが、何故4になってしまうか
全く分かりませんでした。

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

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

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

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

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

xebme

2021/08/16 20:47

Cの問題解説を読むとわかりますが、最後のすぬけが先頭のすぬけに接続される(円周上に並んでいる)観点が抜けています。
guest

回答1

0

java

1 for(int k = 0;k < n;k++){ 2 if(k > 0 && t[k] > ans[k - 1] + s[k - 1]){ 3 ans[k] = ans[k - 1] + s[k - 1]; 4 } else if (k == 0 && t[k] > ans[n - 1] + s[n - 1]){ 5 ans[k] = ans[n - 1] + s[n - 1]; 6 } else { 7 ans[k] = t[k]; 8 } 9 }

こちらのループで、kが0、つまり最初の繰り返しの時に、どのような処理が行われるか考えてみてください。
最初の繰り返しだと、ans[n - 1]にはまだ何の値も設定されていないので、常に0となります。
そうなると、このコードはs[n - 1]t[0]の小さい方をans[0]に代入するという意味になります。

投稿2021/08/14 19:01

actorbug

総合スコア2431

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問