Googleに行きたい大学生

情報系とは無縁の大学生が就職難易度のトップともいわれてる夢の会社に入社できるか挑戦

Atcoder 初めて過去問解けた(入門)

Atcoder という競技プログラミング用サイトには過去問も掲載されてる。

 

適当に簡単そうなやつを選んで解いてみた。

atcoder.jp

 

問題文

すぬけ君は、1 から 12 までの整数を下図のようにグループ分けしました。 整数 xy (1x<y12) が与えられるので、xy が同一のグループに属しているか判定してください。

b4ab979900ed647703389d4349eb84ee.png

制約

  • xy は整数である。

そのまま問題をコピーしてきた。

 

考えた答えは

#include <bits/stdc++.h>
using namespace std;

int main() {
vector<int> groupA = {1,3,5,7,8,10,12};
vector<int> groupB = {4,6,9,11};
bool same =false;
int x,y;
cin>>x>>y;

for(int i=0; i<7; i++)
{ if (x == groupA.at(i))
   { for(int j=1; j<6-i;j++)
      { if(y ==groupA.at(j))

         {same = true; break;}

      } break;
   }
}
if(!same)

{ for(int i=0; i<4; i++)
   {
     if (x == groupB.at(i))
       { for(int j=1; j<3-i;j++)
         { if(y ==groupB.at(j))

            {same = true; break;}

         } break;
       }
   }
}
if(same){cout<<"Yes"<<endl;}
else{cout<<"No"<<endl;}
}

 

色もついてないし見にくいね。

簡単に言うと、xがグループAにあるか探す、あればBもあるか探す。

なかったらグループBにあるか探す以下同様。

 

気を付けたことは無駄な処理をしないこと。

そもそもこの方法がいいのか、そういう計算のオーダーの話については全然勉強できておらずわからない。

当たり前かもしれないけど、今は意識的にしたことは、途中でbreakをいれてforから出ること、ifを使ってAグループで見つけた場合Bでは探さないこと。

 

かなり簡単やと思うけど、少し勉強するだけでこんなことができるとはね。

うれしい。今は↓までできた。

atcoder.jp

 

午後になったので 追記

疲れてきたのかよくわからないが、参照のところで詰まった。

説明を読んでる時から何のためにこんなことをするのかがわからなかった。

練習問題を解くと少し便利性に気づけた。

上書きする権利みたいなイメージ ※自分しかわからないイメージかも

 

int a =3;

int &b = a;

とするとbっていうのはaを変更する権利を持つ。

例えばb=5;ってするとaも5になっちゃう。

ふつうはaは影響されない。

 

関数でも使える

int f(&x) { x +=x;}

さっきのaを使って

int c;

c = f(a);ってすると c=6, a=6になる。

この例を見るだけでは何に役立つか全然わからんかった。

 

自分へのメモみたいになってしまった。