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

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

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

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

Q&A

解決済

1回答

906閲覧

任意の入力に対して長方形の面積の最大値を求めるプログラム

l_h_l_h

総合スコア22

C++

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

0グッド

0クリップ

投稿2017/10/17 15:25

Atcoder Beginner Contest071 C問題より、問題文は以下の通りです

問題文

太さが無視できる棒が N 本あります. i 番目の棒の長さは Ai です.

すぬけ君は,これらの棒から 4 本の異なる棒を選び,それらの棒を辺として長方形(正方形を含む)を作りたいです. 作ることができる最大の長方形の面積を求めてください.
制約
4≤N≤10^5
1≤Ai≤10^9
Ai は整数
http://abc071.contest.atcoder.jp/tasks/arc081_a

此方の問題を以下のプログラムで解いたところ、半分以上不正解となりましたが、理由が分かりません

#include<iostream> #include<stdlib.h> using namespace std; int compar(const int *val1, const int *val2); int main(){ int N,i,x=0,y=0; cin>>N; int A[N]; for(i=0;i<N;i++){ cin>>A[i]; } qsort(A,N,sizeof(int),(int (*)(const void *, const void *))compar); for(i=0;i<N-1;i++){ if(A[i]==A[i+1]){ x=A[i];i+=2;break; } } for(;i<N-1;i++){ if(A[i]==A[i+1]){ y=A[i];break; } } cout<<x*y<<endl; return 0; } int compar(const int *val1, const int *val2) { if ( *val1 > *val2 ) { return -1; } else if ( *val1 == * val2 ) { return 0; } else { return 1; } } コード

この問題文は、入力された数のうち、2回以上出現する数字を大きい順に2つ選び出し、その積を求めることと言い換えられます
入力された数字を配列Aに格納し、それをまず降順にソートします
ループ文により、A[i]とA[i+1]が同じであればその値をxに代入し、iに2プラスします
次に、iの値はそのままでyについても同じことをすることで、yに2番目に大きい2回以上出現した数字が代入されます
最後にそれらを掛けて出力して終了です
用意されている入力例で試したところ合ってそうなのですが、全然違うみたいです
どなたか、どこがおかしいか分かる方がいましたらご助力願います
よろしくお願いいたします

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

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

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

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

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

guest

回答1

0

ベストアンサー

例えば入力値が下記の場合はどうなるでしょうか。

text

14 21000000000 1000000000 1000000000 1000000000

追記:

質問に記載のコードについて変数の型を変えただけですが、手元のgcc環境では動作するようでした。

bash

1$ g++ -v 2gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 3$ cat input 44 51000000000 1000000000 1000000000 1000000000 6$ cat input | ./a.out 71000000000000000000

C++

1#include <iostream> 2#include <stdlib.h> 3using namespace std; 4 5int compar(const long long *val1, const long long *val2); 6 7int main(void) 8{ 9 long long N, i, x = 0, y = 0; 10 cin >> N; 11 long long A[N]; 12 13 for (i = 0; i < N; i++) 14 { 15 cin >> A[i]; 16 } 17 18 qsort(A, N, sizeof(long long), (int (*)(const void *, const void *))compar); 19 20 for (i = 0; i < N-1; i++) 21 { 22 if (A[i] == A[i+1]) 23 { 24 x = A[i]; 25 i += 2; 26 break; 27 } 28 } 29 30 for (; i < N-1; i++) 31 { 32 if (A[i] == A[i+1]) 33 { 34 y = A[i]; 35 break; 36 } 37 } 38 39 cout << x * y << endl; 40 41 return 0; 42} 43 44int compar(const long long *val1, const long long *val2) 45{ 46 if (*val1 > *val2) 47 { 48 return -1; 49 } 50 else if (*val1 == *val2) 51 { 52 return 0; 53 } 54 else 55 { 56 return 1; 57 } 58}

投稿2017/10/17 15:59

編集2017/10/18 03:40
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

l_h_l_h

2017/10/17 16:11

回答ありがとうございます 試したところ、25と出力されました
退会済みユーザー

退会済みユーザー

2017/10/17 16:13

すみません、コードを読み違えていたので条件を変更しました。
l_h_l_h

2017/10/17 16:38

ありがとうございます 謎の大きな負の数が出力されてしまいました long型で試してみてもダメだったのですが、どこがおかしいでしょうか?(それどころか、long型にしたら出力結果が全部0になってしまいました……)
退会済みユーザー

退会済みユーザー

2017/10/17 16:43

xとyの積がintの範囲を超えるため、算術オーバーフローが発生しています。 これをどのように回避するのか、というのがこの設問での課題です。
退会済みユーザー

退会済みユーザー

2017/10/17 23:00 編集

きちんと正攻法で解かれるようであれば、困難は分割せよ、というところでしょうか。 具体的な話まですると、多倍長整数で調べられるとよいでしょう。 とにかく解ければ、ということであれば、使えるものは使え、ということになるかと思います。 long intがダメだったというのは処理系にもよるので一概には理由は言えませんが、言語仕様上long long intというものもあります。
l_h_l_h

2017/10/18 03:11

ありがとうございます long long int、mp::cpp_intの両方を試してみましたが、出力はいずれも0となってしまいました 大きい数の分割にはどのような手法があるでしょうか?
退会済みユーザー

退会済みユーザー

2017/10/18 10:20

> 大きい数の分割にはどのような手法があるでしょうか? 一番イメージしやすい形は、筆算での計算方法です。 筆算では、1桁同士の計算と繰り上がりを用いて、複数桁同士の和や積を求めることを可能としています。 これを変数が扱える範囲で同様に行うことで、任意精度の計算が可能となります。
l_h_l_h

2017/10/19 05:31

変数の型を変えても出力が0になる件ですが、恥ずかしながらクイックソートの引数を変えるのを忘れていました…… 無事正解になりました! 筆算の考え方は盲点でした こちらも試してみようと思います 長々とありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問