下記のリンクの問題を解説のやり方にそってやってみたつもりなのですが,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
公式解説が理解出来なくても問題名で検索すれば解説がありますよ。
試したことが書かれていませんがテストケースと見比べたりして気づいたことなど無いですか?
提出済みコードいくつか見てどのようにして解法をコードに実装しているかを調べるのも学習方法だと思います。
毎回毎回解けない問題を質問されるのはどうかと思いますよご自分のためにも。
こう言ったらなんですが提出してみてACならなかったらあまり調べずに質問してませんか?
もう少しご自分でなんとかする努力をした方が良いと思います。
試したことを書いていないと丸投げと思われますよ。
ABC111Cで検索すると少なくとも10個以上の解説がヒットします。
前の質問にも書きましたが、すぐにコードを書くのではなくて実装手順を手書きで箇条書きに書き出してみてはいかがでしょうか?
試したことにそれが書かれていればご自分にとっての再確認にもなりますし、質問を見た回答者がどこが理解出来ていないのか把握するのに役立つと思いますよ。
今の質問の内容のままだと「何かよくわからないけどWAなので間違い探してください」という丸投げと思われても仕方ありません。
質問するならご自分のためにも努力した姿勢を見た方が分かるように試したことや検索して参考にした解説などを提示すべきです。
まさかと思いますが公式解説見ただけで質問したわけでは無いですよね?
提出済みのコードをいくつか見てみたのですが,あまり自分の考え方を直すものを見つけられなかったので質問させていただきました.これは,自分の知識不足のせいというのが大きいですね.申し訳ございません.
自分で努力したところというのがいまいち正確にわかっていない状況でして,この問題で言えば解法が考え付かなかったのでまず公式解説をみながら書いたのですが,この場合わからなくて調べたことや検証したことははコード全体に当たるのではないか,と個人的には感じていて,各箇所でお伝えするものでもないのかと思っていました.
ですがこちらの考えの根本を知らない回答者様にとってこのコードを見ただけでは理解しにくいのではないかということは確かに感じました.
となると,検証した点や努力した点を表記するというよりかは,コードの各箇所でこの部分はどういう考えのもとで書いたのかをコメントアウトする,といった解釈でよろしいでしょうか.
mjkさんがおっしゃられている問題の名前のようなものはどこを見ればわかりますでしょうか.まだ使い慣れていなくてどこを見ればいいのかわからないです.
長文になってしまいましたが,よろしくお願いします.
問題名
https://gyazo.com/2abe32b6c263b82e99bc2169989022d9
検索する時はARC103Cなどのコンテスト名+A,B,Cでもヒットします。
遠回しにして察して欲しかったのですが・・・
「C++始めて数日」で「vector使ったこともない」のに「ARCのC問題」は「分不相応」で、
「WAして」「解説見ても」「提出済みいくつか見ても分からない」から「教えて」だと、
「丸投げ」と受け取る方がほとんどだと思いますよ。実際低評価3件も入ってますし。
正直スルーしたかったのですが質問者さんは努力家だと思うので敢えて言いたくないことを言いました。
これからも同じように質問を続けるならきついこと言われると思いますがめげずに頑張ってください。
コンテスト名などの情報から検索するのですね.教えていただきありがとうございます.
あまりに実力不足だったということですね.言いにくいことをおっしゃっていただきありがとうございます.
質問の仕方などは工夫していきます.
ご指摘ありがとうございました.
回答1件
あなたの回答
tips
プレビュー