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

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

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

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

Q&A

解決済

1回答

1426閲覧

atcoder nomura プログラミングコンテスト 2020 c問題 Folia が解けない

goro_gnm

総合スコア42

C++

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

0グッド

0クリップ

投稿2020/05/30 15:07

編集2020/05/30 15:09

atcoder NOMURAプログラミングコンテスト2020 のc問題でいくつかのケースについてWAとなってしまいます。

解説や他の人のコードをながめたりしましたが、自力で解決できなかったのでお力を貸していただけるとうれしいです。

問題文についてはこちらを参照してもらえればと思います。
https://atcoder.jp/contests/nomura2020/tasks/nomura2020_c

自分のコード

c++

1#include<iostream> 2#include<algorithm> 3#include<string> 4#include<map> 5#include<cmath> 6#include<iomanip> 7#include<math.h> 8#define rep(i, n) for(int i=0; i<n; i++) 9using namespace std; 10typedef long long ll; 11 12int main(){ 13 ll N; cin >> N; 14 ll a[N+1]; 15 ll node = 0; 16 rep(i, N+1){ 17 cin >> a[i]; 18 } 19 ll c[N+2]; 20 c[0] = 1; 21 22 for(ll i=0; i<N+1; i++){ 23 c[i+1] = 2*(c[i]-a[i]); 24 if(c[i+1] < 0){ 25 cout << -1 << endl; 26 return 0; 27 } 28 } 29 30 node += a[N]; 31 ll now = a[N]; 32 33 for(ll i=N-1; i>-1; i--){ 34 now += a[i]; 35 if(now+a[i] < c[i]){ 36 node += now; 37 }else{ 38 node += c[i]; 39 } 40 } 41 cout << node << endl; 42} 43

変更を加えたが結局うまくいかなかったコード

ACしている人のコードを参考にして以下のコードなら、上のコードでWAだったものがACできることはわかりました。
しかし、加えた記述の目的がわからないのと、下のコードでも全てのケースがACとはなりませんでした。
その辺についても説明をしてもらえるとうれしいです。
下のコードは、上のコードに変更を加えた部分を ////// で囲っています。

c++

1#include<iostream> 2#include<algorithm> 3#include<string> 4#include<map> 5#include<cmath> 6#include<iomanip> 7#include<math.h> 8#define rep(i, n) for(int i=0; i<n; i++) 9using namespace std; 10typedef long long ll; 11////////////////////////////// 12#define INF 1000000000000000LL 13////////////////////////////// 14 15int main(){ 16 ll N; cin >> N; 17 ll a[N+1]; 18 ll node = 0; 19 rep(i, N+1){ 20 cin >> a[i]; 21 } 22 ll c[N+2]; 23 c[0] = 1; 24 25 for(int i=0; i<N+1; i++){ 26 //////////////////////////////// 27 c[i+1] = min(2*(c[i]-a[i]),INF); 28 //////////////////////////////// 29 if(c[i+1] < 0){ 30 cout << -1 << endl; 31 return 0; 32 } 33 } 34 35 node += a[N]; 36 ll now = a[N]; 37 38 for(int i=N-1; i>-1; i--){ 39 now += a[i]; 40 if(now+a[i] < c[i]){ 41 node += now; 42 }else{ 43 node += c[i]; 44 } 45 } 46 cout << node << endl; 47}

よろしくおねがいします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

C++

1c[i+1] = min(2*(c[i]-a[i]),INF);

ここについてはオーバーフロー回避のため
WAが出ることについては、何をしようとしてるのかわからないので何とも言えませんが

C++

1 now += a[i]; 2 if(now+a[i] < c[i]){ 3 node += now; 4 }else{ 5 node += c[i]; 6 }

ここでやりたいことができてるのかの確認が必要でしょう

投稿2020/05/30 16:22

yudedako67

総合スコア2047

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

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

goro_gnm

2020/05/30 17:37 編集

回答ありがとうございます。 > ここについてはオーバーフロー回避のため なるほど、c[i] は 2^{100000} 程度の大きさになってしまう可能性があるが、a[i] の上限よりも大きい値には意味がないからオーバーフロー回避として適当な値でスレッショルドしても問題がないということなんですね。理解しました、ありがとうございます。 > ここでやりたいことができてるのかの確認が必要でしょう ケアレスミスでおかしなコードになってしまっていました。 ```c++ now += a[i]; if(now < c[i]) node += now; else node += c[i]; ``` に変更して提出したところ、ACでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問