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問題は未履修のダイクストラだなと思い 調べながら書こうとしたが、間に合わなかった
・優先度付きキュー/ダイクストラ法を履修すること
引き続き、のんびり精進します。