murnana's diary

のんびり書きます。マサカリまってます(震えながら

【ABC086】AtCoder Beginner Contest 086 ふりかえり

AtCoder Beginner Contest 086 - AtCoder

C問題が解けた。地味に嬉しい。 D問題は諦め。「絶望を贈ろうか」

現在地: f:id:murnana:20180123231332g:plain

解けた問題と解説

解けた問題は、A,B,C。Cは最初諦めかけてた。
if文で頑張っていたらタイムオーバーになる気がしたので。

Aの回答はこちら: Submission #1999098 - AtCoder Beginner Contest 086

//#include <iostream>
#include <stdio.h>

int main(void) {
  
  // input
  int a,b;
  scanf("%d %d",&a,&b);
  
  // output
  if( ((a*b)%2) <= 0 ){
    printf("Even");
  } else {
    printf("Odd");
  }
  
  return 0;
}

C言語にしてしまった。
C++コンパイルするのと、Cでコンパイルするのとではコード長が違ったので、良い方を選んだ結果。

偶数か奇数かを分けるのは、2の倍数かどうか、逆に言うと、2で割り切れるかどうか。
なので、単純に積に2で割った余りがあるかどうかで判別。

0割り考えていなかった…。 この場合、結果は"Even"になる。


Bはこちら: Submission #2000727 - AtCoder Beginner Contest 086

//#include <iostream>
#include <stdio.h>
#include <math.h>

int main(void) {

  char a[8],b[4];
  float x;
  
  // input
  scanf("%s %s",a,b);
  strcat(a,b);
  x = atoi(a);
  
  x = sqrt(x);
  
  // output
  if( (x-(int)x) <= 0 ){
    printf("Yes");
  } else {
    printf("No");
  }
  
  return 0;
}

順番的に、 1. 文字列として読み込む 2. 文字列をくっつける(strcat()) 3. くっつけた文字列を数値に変換(atoi()) 4. 変換した数値の平方根を吐き出す(sqrt()) 5. 吐き出した数値から小数点以下のみをとりだし、小数点以下がなければ平方数 という流れ。


C問題は、最初はWA : Submission #2002591 - AtCoder Beginner Contest 086
その次はAC: Submission #2002941 - AtCoder Beginner Contest 086

//#include <iostream>
#include <stdio.h>
#include <math.h>
typedef long TYPE;

TYPE N,x,y,t,i,T,X,Y,mv,mt;

int main(void) {
  T =
    X = 
    Y = 0;
  // input
  scanf("%d",&N);
  for(i=0;i<N;++i){
    scanf("%d %d %d",&t,&x,&y);
    mt = t - T;
    mv = abs(x-X) + abs(y-Y);
    if(mt-mv<0){
      printf("No");
      return 0;
    }
    if((mt-mv)%2>0) {
      printf("No");
      return 0;
    }
    X = x;
    Y = y;
    T = t;
  }
  
  // output
  printf("Yes");
  
  return 0;
}

解き方は
1. とりあえず目的地まで行く
2. まだ歩数が余っていたら、何処か往復してゴールに戻ってこれるのかを確認する

目的地に行く方法は何でもいいが、少なくともXにいくつ、Yにいくつ移動する必要があるかを知らなければならない。このXにいくつ、Yにいくつを足せば、何秒で目的地につくかがわかる。
問題は、余ったとき。
例題にヒントがあった。一度ゴールについたあと、もとの道にもどり、再びゴール地点に戻っている。 つまり、余った分で往復できるのかを調べればいい。 というわけで、余った数が偶数なのかを判定している。