スクリーンショット_2019-04-04_23

文系ギャルが0から始める競技プログラミング#9

Intro


この記事は不定期連載です。
↓最初の一本はこちら↓
文系ギャルが0から始める競技プログラミング#0

↓直前の記事はこちら↓
文系ギャルが0から始める競技プログラミング#8

・ABC081B


引き続きAtCoder Beginners Selectionの問題を解いていきます。
B問題に入りました!

問題文
黒板に
N個の正の整数 A1,...,ANが書かれています.
すぬけ君は,黒板に書かれている整数がすべて偶数であるとき,次の操作を行うことができます.
黒板に書かれている整数すべてを2で割ったものに置き換える.
すぬけ君は最大で何回操作を行うことができるかを求めてください.

制約
1≤N≤200
1≤Ai≤10^9

入力
入力は以下の形式で標準入力から与えられる。
N
A1 A2...AN

出力
すぬけ君は最大で何回操作を行うことができるかを出力せよ.
― ABC081B - Shift only

また謎ムーブしてますねすぬけくん
Nは200までということなので、200個の配列をつくってぶっこんでいくことにします。

   int N;
   cin >> N;
   
   int A[200] = {};
   int n = N;
   int i = 0;
   
   while (n--){
       cin >> A[i];
       i++;
   }

ゴールを整理します。
「何回割ったか」がゴールなので、割ったタイミングでゴール用の変数ansに1を入れることにします。

図の通りに書こうとしてみます。


int a = 0;
int ans = 0;
int max = 128;

while(max--){
       for(i=0;i<N;i++){
           if(A[i]%2!=0){
               a++;
           }
       }
       
       if(a==0){
           ans++;
           for(i=0;i<N;i++){
               A[i] = A[i]/2;
               
           }


①と②の操作を何回繰り返すか(maxに何入れるか)で詰まっていました…。
10が1回しか2で割れないんだから、10^9は9回しか割れないんじゃね?天才的ひらめきにより思って提出したのが
WAで悲しみに暮れていましたが、とりあえずいっぱい入れとくことで解決しました。。。腑に落ちないけど。。

#include <iostream>
using namespace std;
int main()
{
   int N;
   cin >> N;
   
   int A[200] = {};
   int n = N;
   int i = 0;
   
   while (n--){
       cin >> A[i];
       i++;
   }
   
   int a = 0;
   int ans = 0;
   int max = 128;
   
   while(max--){
       for(i=0;i<N;i++){
           if(A[i]%2!=0){
               a++;
           }
       }
       
       if(a==0){
           ans++;
           for(i=0;i<N;i++){
               A[i] = A[i]/2;
               
           }
       }
   }
   cout << ans << endl;
   return 0;
}

まあ優勝には変わりないのですけど、
もっとスマートな方法がありそうな気がします
Twitterコメントでぜひこっそり教えてください。
(DMも全開放しています。先輩リスト更新中です!)

最近ジアレイがあまり並んでなくて、タピオカいっぱい飲めてるんるんなんですが
Twitterで「タピオカはシンプルに太る」というツイートを見てしまって心が締め付けられています…。
頭使ってるから…いいよね…?

Outro


#10に続く!(不定期連載です。)

これは成功と挫折を繰り返し、
タピオカ片手に難問を解く、
ギャルプログラマが生まれるまでの物語である…。

この記事が気に入ったらサポートをしてみませんか?