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

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

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

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

C++

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

Q&A

解決済

1回答

1132閲覧

指定された解き方に沿っていることが出来ているかどうか教えたいただきたい

grape_ll

総合スコア83

アルゴリズム

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

C++

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

0グッド

1クリップ

投稿2020/09/09 07:19

下記のリンクの問題を解説のやり方にそってやってみたつもりなのですが,9つのケースではじかれてしまいました.どのような点で解答とそういがあるのか教えていただきたいです.
また,つい最近C++を学び始めたばかりなのでここはこうするとより簡単に書けるという所があればそこも教えていただきたいです.
よろしくお願いします.
問題
解説

C++

1#include<stdio.h> 2#include<iostream> 3#include<string> 4#include<memory> 5#include<cmath> 6#include<algorithm> 7int main(){ 8 9 int n; 10 std::cin>>n; 11 int *e=nullptr; 12 int *o=nullptr; 13 try{ 14 e=new int[n/2]; 15 o=new int[n/2]; 16 }catch(const std::bad_alloc e){ 17 std::cout<<"error"<<std::endl; 18 } 19 20 21 int k=0,l=0; 22 for(int i=0;i<n;i++) { 23 if(i%2==1) { 24 std::cin>>e[k]; 25 k++; 26 } 27 else { 28 std::cin>>o[l]; 29 l++; 30 } 31 } 32 33 //for(int i=0;i<n/2;i++) std::cout<<o[i]<<":"<<e[i]<<std::endl; 34 35 int E1=e[0],E2,O1=o[0],O2; 36 int Efre1=1,Efre2=0,fre=1; 37 38 39 std::sort(e,e+n/2); 40 std::sort(o,o+n/2); 41 42 int Eflag=0,Oflag=0; 43 44 for(int i=1;i<n/2;i++){ 45 if(e[i]==e[i-1]){ 46 fre++; 47 } 48 else if(e[i]!=e[i-1]){ 49 Eflag++; 50 if(Efre1<fre){ 51 Efre1=fre; 52 E1=e[i-1]; 53 } 54 else if(Efre2<fre){ 55 Efre2=fre; 56 E2=e[i-1]; 57 } 58 fre=1; 59 } 60 } 61 if(Eflag==0) Efre1=fre; 62 63 fre=1; 64 65 int Ofre1=1,Ofre2=0; 66 for(int i=1;i<n/2;i++){ 67 if(o[i]==o[i-1]){ 68 fre++; 69 } 70 else if(o[i]!=o[i-1]){ 71 if(Ofre1<fre){ 72 Ofre1=fre; 73 O1=o[i-1]; 74 } 75 else if(Ofre2<fre){ 76 Ofre2=fre; 77 O2=o[i-1]; 78 } 79 fre=1; 80 } 81 } 82 if(Oflag==0) Ofre1=fre; 83 84 //std::cout<<Efre1<<":"<<Efre2<<":"<<std::endl; 85 //std::cout<<Ofre1<<":"<<Ofre2<<":"<<std::endl; 86 87 int ans=100000000; 88 89 if(E1==O1){ 90 if(E1!=O2) ans=(n/2-Efre1)+(n/2-Ofre2); 91 if(E2!=O1) if(ans>(n/2-Efre2)+(n/2-Ofre1)) ans=(n/2-Efre2)+(n/2-Ofre1); 92 } 93 else{ 94 ans=(n/2-Efre1)+(n/2-Ofre1); 95 } 96 97 std::cout<<ans<<std::endl; 98 99 100 101 delete e; 102 delete o; 103 return 0; 104} 105

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

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

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

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

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

mjk

2020/09/09 08:26 編集

公式解説が理解出来なくても問題名で検索すれば解説がありますよ。 試したことが書かれていませんがテストケースと見比べたりして気づいたことなど無いですか? 提出済みコードいくつか見てどのようにして解法をコードに実装しているかを調べるのも学習方法だと思います。 毎回毎回解けない問題を質問されるのはどうかと思いますよご自分のためにも。 こう言ったらなんですが提出してみてACならなかったらあまり調べずに質問してませんか? もう少しご自分でなんとかする努力をした方が良いと思います。 試したことを書いていないと丸投げと思われますよ。 ABC111Cで検索すると少なくとも10個以上の解説がヒットします。
mjk

2020/09/09 10:09

前の質問にも書きましたが、すぐにコードを書くのではなくて実装手順を手書きで箇条書きに書き出してみてはいかがでしょうか? 試したことにそれが書かれていればご自分にとっての再確認にもなりますし、質問を見た回答者がどこが理解出来ていないのか把握するのに役立つと思いますよ。 今の質問の内容のままだと「何かよくわからないけどWAなので間違い探してください」という丸投げと思われても仕方ありません。 質問するならご自分のためにも努力した姿勢を見た方が分かるように試したことや検索して参考にした解説などを提示すべきです。 まさかと思いますが公式解説見ただけで質問したわけでは無いですよね?
grape_ll

2020/09/10 05:34

提出済みのコードをいくつか見てみたのですが,あまり自分の考え方を直すものを見つけられなかったので質問させていただきました.これは,自分の知識不足のせいというのが大きいですね.申し訳ございません. 自分で努力したところというのがいまいち正確にわかっていない状況でして,この問題で言えば解法が考え付かなかったのでまず公式解説をみながら書いたのですが,この場合わからなくて調べたことや検証したことははコード全体に当たるのではないか,と個人的には感じていて,各箇所でお伝えするものでもないのかと思っていました. ですがこちらの考えの根本を知らない回答者様にとってこのコードを見ただけでは理解しにくいのではないかということは確かに感じました. となると,検証した点や努力した点を表記するというよりかは,コードの各箇所でこの部分はどういう考えのもとで書いたのかをコメントアウトする,といった解釈でよろしいでしょうか. mjkさんがおっしゃられている問題の名前のようなものはどこを見ればわかりますでしょうか.まだ使い慣れていなくてどこを見ればいいのかわからないです. 長文になってしまいましたが,よろしくお願いします.
mjk

2020/09/10 07:40

問題名 https://gyazo.com/2abe32b6c263b82e99bc2169989022d9 検索する時はARC103Cなどのコンテスト名+A,B,Cでもヒットします。 遠回しにして察して欲しかったのですが・・・ 「C++始めて数日」で「vector使ったこともない」のに「ARCのC問題」は「分不相応」で、 「WAして」「解説見ても」「提出済みいくつか見ても分からない」から「教えて」だと、 「丸投げ」と受け取る方がほとんどだと思いますよ。実際低評価3件も入ってますし。 正直スルーしたかったのですが質問者さんは努力家だと思うので敢えて言いたくないことを言いました。 これからも同じように質問を続けるならきついこと言われると思いますがめげずに頑張ってください。
grape_ll

2020/09/11 06:06

コンテスト名などの情報から検索するのですね.教えていただきありがとうございます. あまりに実力不足だったということですね.言いにくいことをおっしゃっていただきありがとうございます. 質問の仕方などは工夫していきます. ご指摘ありがとうございました.
guest

回答1

0

ベストアンサー

EflagとOflagの役割が不十分なようです。特にOflagはループ中に更新されません。

問題なのは e[i]!=e[i-1] が満たされない限り更新されたfreが使われないことで、これはすべての数が同じ場合に限りません。例えば e = [1,2,2] の場合にどうなるかを考えるとわかると思います。

あと、配列をnew/deleteするぐらいならvectorを使ったほうがいいです。

投稿2020/09/09 08:00

yudedako67

総合スコア2047

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

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

grape_ll

2020/09/10 05:37

確かにflagが正しく機能していない,つまりfreの更新がうまくいっていないみたいですね.2,2,2のような場合は考えていたのですが,そのようなケースを落としていました. vectorは使ったことがないのですが,調べて活用してみようと思います. ご回答ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問