【ABC過去問演習】茶色埋め 3 日目

割り算はあまりやらないようにしようという話

解いた問題

  • 7/11 ABC の 146C, 144D, 143D, 137C
  • 7/12 ABC の 136D,133C
  • 7/14 ABC の 131C, 131D, 130C

ABC 130 C 問題について

問題

リンク先参照
C - Rectangle Cutting

解き方

どの点を通る直線も長方形を半分に分割することができる。そして長方形の中心を通り、長方形を半分に分割する直線は2つある。よって 2x=W かつ 2y=H なら複数の直線を引けることになる。
ただ、最初は以下のようなコードのように W/2=x かつ H/2=y で if 文を作ってしまったために WA となってしまった。例えば H=W=5, x=y=2 のときまずいことになるのがわかる。

WA したコード
#include<bits/stdc++.h>
using namespace std;
using ll = int64_t;

int main(){
  ll w,h,x,y;cin>>w>>h>>x>>y;
  bool ans=0;
  if(w/2==x&&h/2==y)ans=1;
  cout<<fixed<<setprecision(15)<<(double)w*h/2<<" ";
  cout<<ans<<endl;
}

正しくは以下のコードのようにかけ算で条件分岐を書く。

AC したコード
#include<bits/stdc++.h>
using namespace std;
using ll = int64_t;

int main(){
  ll w,h,x,y;cin>>w>>h>>x>>y;
  bool ans=0;
  if(w==2*x&&h==2*y)ans=1;
  cout<<fixed<<setprecision(15)<<(double)w*h/2<<" ";
  cout<<ans<<endl;
}
教訓

かけ算で済むならかけ算にしよう。割り算は極力やらないようにしよう。

進捗

f:id:tomoand:20200714153531p:plain
がんばるぞい