見出し画像

SOMPO HD プログラミングコンテスト2021 (ABC192) 参戦記録 p.39

itsukiです。
SOMPO HD プログラミングコンテスト2021 (AtCoder Beginner Contest 192) に参戦した様子です。解説記事ではありません。

結果は A, B, C の 3完でした。
回答時間合計:63分42秒
パフォーマンス:294

考察の流れ

A - Star

「次にご褒美をもらうためには、あと何枚?」なので、100 - (今までに集めたコインの枚数%100) で良さそう
#include <stdio.h>
int main(){
   int x;
   scanf("%d",&x);
   printf("%d\n", 100 - (x%100));
   return 0;
}

B - uNrEaDaBlE sTrInG

先頭を「0番目」としてしまい、しばらくサンプルが合わず悩む
#include <stdio.h>
#include <string.h>
#define Yes()       printf("Yes\n")
#define No()        printf("No\n")
int main(){
   char s[1005]={0};
   scanf("%s",s);
   int flag=0;
   for(int i=0; i<strlen(s); i++){
       if( i%2 ){
           if( s[i] > 91 ){ flag=1; }
       }else{
           if( s[i] < 97 ){ flag=1; }
       }
   }
   if( flag==0 ){ Yes(); }
   else{ No(); }
   return 0;
}

C - Kaprekar Number

問題文を読んで「これはカプレカ数では!?」とひらめいたつもりが問題名に書いてあった
間に合わないかと思い、K回計算し終わる前に同じ値が2回連続したら計算を打ち切るようなコードにしたが、無意味だった(コンテスト後に気づいた)
思いつくままに実装していたら長くなってしまった

(復習のため あえてコンテスト中に提出した乱雑コードを載せています)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef long long ll;

ll len, pre_f, f, k;

ll _digit(ll n){ ll num=0; while(n>0){ num++; n/=10; } return num; }

ll f_calc(ll x1, ll x2){
   static int cnt=0;
   ll t, tmp1, tmp2;
   char g1[12]={0}, g2[12]={0};
   
   sprintf(g1,"%lld",x1);
   sprintf(g2,"%lld",x2);

   for(int i=0; i<len-1; i++){
       for(int j=i+1; j<len; j++){
           if(g1[i] < g1[j]){
               t     = g1[i];
               g1[i] = g1[j];
               g1[j] = t;
           }
           if(g2[i] > g2[j]){
               t     = g2[i];
               g2[i] = g2[j];
               g2[j] = t;
           }
       }
   }
   pre_f = f;
   
   sscanf(g1,"%lld",&tmp1);
   sscanf(g2,"%lld",&tmp2);
   f = tmp1 - tmp2;
   cnt++;
   len = _digit(f);
   if( cnt >= k || f == pre_f ){ return f; }
   else                        { return f_calc( f, f ); }
}

int main(){
   ll n;
   scanf("%lld%lld",&n,&k);
   len = _digit(n);
   f = n;
   pre_f = n;
   if( k==0 ){ printf("%lld\n",n); return 0; }
   printf("%lld\n",f_calc( n, n ));
   return 0;
}

まとめ

・3完したが 早解き出来なかったため冷えた(悲しい)
・C問題で、無駄な処理を考えて時間を食ってしまったのが悔しい
・反面、ごりごり実装できて楽しかった
・E問題は未履修のダイクストラだなと思い 調べながら書こうとしたが、間に合わなかった
・優先度付きキュー/ダイクストラ法を履修すること

引き続き、のんびり精進します。

#参戦記録 #備忘録 #AtCoder #SOMPOHD #ABC192 #プログラミング #競プロ #C言語

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