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

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

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

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

C++

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

Q&A

解決済

1回答

1593閲覧

AtCoder ABC 059 C - Sequence の解答例のロジックを理解したい

kei0105

総合スコア8

アルゴリズム

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

C++

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

0グッド

0クリップ

投稿2020/10/06 09:14

編集2020/10/08 11:51

AtCoder ABC 059 - Sequence の不明点

AtCoder ABC 059 C - Sequenceにて、解法がわからなかったので解答の例を調べるも不明点(解答コード)がよく分からなかったため質問します。
問題:https://atcoder.jp/contests/abc059/tasks/arc072_a

以下、ネットの解答例を参考に作成したのですが、slove関数のif文で偶奇数で変数nowの正負の時に何を行なっているのかが分かりません。

実装コード

c++

1#include <bits/stdc++.h> 2using namespace std; 3 4long long n; 5vector<long long> a; 6 7long long solve(int x); 8 9int main() { 10 cin >> n; 11 for(int i = 0; i < n; ++i) { 12 int x; 13 cin >> x; //項の一つ一つ 14 a.push_back(x); 15 } 16 cout << min(solve(0), solve(1)) << endl; 17 return 0; 18} 19 20long long solve(int x) { //引数は0か1 21 long long ans = 0, now = 0; 22 23 for(long long i = 0; i < n; ++i) { 24 now += a[i]; //累積和 25 26 if((i % 2 == x) && (now >= 0)) { 27 ans += now + 1; //ans = ans + now + 1 28 now = -1; 29 } 30 if(!(i % 2 == x) && (now <= 0)) { 31 ans -= now - 1; 32 now = 1; 33 } 34 } 35 return ans; 36}

具体的な不明部分

if((i % 2 == x) && (now >= 0)) { ans += now + 1; //ans = ans + now + 1 now = -1; } if(!(i % 2 == x) && (now <= 0)) { ans -= now - 1; now = 1; }

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

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

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

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

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

guest

回答1

0

ベストアンサー

solve(0)最初の符号がマイナスの場合
最初のif文で
奇数番目の符号がマイナス( i%2 == x )のとき累計が0より大きいなら( 累計が0より小さいなら操作の必要がない )
累計 + 1する( 最初の符号がマイナスなので累計 + 1回操作を行うことで -1 になる )
ことで操作に必要な回数を ans に代入し、それを最初の符号がプラスのときとマイナスのとき両方で行っていることだと思います。
偶数番目の符号がプラス...

solve(1)は最初の符号がプラスの場合
最初のif文で
偶数番目の符号がプラス...
奇数番目の符号がマイナス...

を繰り返しているのだと思いました。 最後に最初の符号部分がマイナスから始まった場合と
プラスから始まった場合を比較して、操作回数が少ない方を出力しているのかなと思いました。

投稿2020/10/08 05:04

編集2020/10/08 07:06
mapuaka

総合スコア7

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

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

kei0105

2020/10/08 11:26

回答ありがとうございます。 >>( 最初の符号がマイナスなので累計 + 1回操作を行うことで -1 になる ) 偶奇で何がしたいのかは分るのですが、例えば最初の符号がマイナスで奇数の3番目の時、aの値が-1,5,-1の時-1にはどのようになるのでしょうか? ※変数nowの扱いがよく分かってないかもしれません
また、forの繰り返しごとにnowを1or-1にしてしまう理由が分かりません。
mapuaka

2020/10/08 12:08

-1, 5, -1のときを例に言うと、 solve(0) i=0のとき now = -1 nowがマイナスなので2つのif文はスルー i=1のとき now = -1 + 5 = 4 nowがプラスなので2つのif文はスルー i=2のとき now = 4 - 1 = 3 nowがプラスなのでif文が実行される ans = 3 + 1 = 4 now = -1 ( 1増やすor減らす操作をした後の3番目の値と1,2番目の要素の総和がマイナス1になるため-1になります。 ) よってsolve(0)のときは4回の操作が必要になります。 -1 , -5 , -1 → -1, 5, -5 1項目までの総和 -1 2項目までの総和 4 3項目までの総和 -1 となり、条件を満たしています。(間違ってたらすいません) solve(1)の場合をぜひやってみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問