chacoderのブログ

競技プログラミングそのほか

ARC105参戦記

f:id:chacoder:20201012094203p:plain

はじめに

2020年10月11日22:30からARC105に出場しました。

ABの2完 1ペナ 1593/3806位 パフォ979でレーティングは21あがって807に。
4回ぶりに再入緑しhighestを更新しました。

f:id:chacoder:20201012094259p:plain

A問題

4つの数を2つに分割した際に分割されたそれぞれの数が等しい場合があるかという問題です。

さすがにARCでA問題からそこそこ骨があります。
4つの数から1つもしくは2つを選ぶ組み合わせなので実質7通りしかなく,すべて書き出す方針でACしました。回答時間5分28秒はまあまあでした。

提出コード

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

int main(){
  long long A[4];
  for(int i=0;i<4;i++){
    cin>>A[i];
  }
  if(A[0]==A[1]+A[2]+A[3] || A[1]==A[0]+A[2]+A[3] ||A[2]==A[1]+A[0]+A[3] ||A[3]==A[1]+A[2]+A[0] ){
    cout<<"Yes"<<endl;
    return 0;
  }
  if(A[0]+A[1]==A[2]+A[3] || A[0]+A[2]==A[1]+A[3] ||A[0]+A[3]==A[2]+A[1]){
    cout<<"Yes"<<endl;
    return 0;
  }    
  cout<<"No"<<endl;
  return 0;
}

B問題

B - MAX-=min


複数毎のカードがあり最大値と最小値が等しい場合は終了,そうでない場合は,最大値から最大値と最小値の差を引いた数で最大値を置き換える,ということを繰り返し最後に残る数を出力する問題です。

愚直にシミュレーションしてTLEたたいたのは余計でした。
大きい数から小さい数を引いて大きい方と入れ替える,というのはユークリッドの互除法です。

GCDとることに気づいてサンプルケースを通しAC。13分1秒+1ペナ。

ACしたコード

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

int main(){
  int N;
  cin>>N;
  int A[N];
  for(int i=0;i<N;i++){
    cin>>A[i];
  }
  if(N==1){
    cout<<A[0]<<endl;
    return 0;
  }
  
  sort(A,A+N);
  int ans=A[0];
  for(int i=0;i<N;i++){
    ans=gcd(ans,A[i]);
  }
  cout<<ans<<endl;

  return 0;
}

C問題以下

手が出ませんでした。
C問題は-1になるパターン(いちばん重いラクダがいちばん軽い部品の耐荷重を超えるケース)まで思いつきましたが,そのあとをどう考えていくのか組み立てられませんでした。

D問題も問題を見るだけ見ましたがどんなゲームかをしっかり理解するところまでもいきませんでした。

まだまだ力不足ですが更に上を目指すためにはこのようなレベルの問題にも立ち向かっていけるぐらいの力が必要です。

まとめ

再び緑の大地を踏みしめることができました。
まだまだ茶と緑のボーダーレベルの実力で、着色難化傾向もある中でまたいつ茶に落ちるかもわかりませんが,まずは緑定着を目指します。

そしていつの日か大海原に漕ぎ出す日を夢見てゆっくり精進を重ねていきたいと思います。