ARC039-A 備忘録 p.17
itsukiです。
AtCoderの過去問を解いた様子です。解説記事ではありません。
考察の流れ
A をどれだけ大きくできるか vs B をどれだけ小さくできるか
つまり (999-A) vs (B-100)
前者なら A に上げしろがあるので、A の数値をなるべく 999 に近づける
後者なら B に下げしろがあるので、B の数値をなるべく 100 に近づける
一番上の桁をゼロにはできない、っていうのは後者の時に考えればいい
WA…
(999-A) vs (B-100) とか言ってたくせにコードが
(999-A) vs (B) になっていた…
#include <stdio.h>
int main(){
int n,m;
char a[4]={0}, b[4]={0};
scanf("%d%d",&n,&m);
sprintf(a,"%d",n);
sprintf(b,"%d",m);
// 999-A >= B-100
if( (999-n) >= m-100 ){
// if( (999-n) >= m ){ <- WAの原因…なぜコメントと食い違っている…
if ( a[0]!='9' ){ a[0]='9'; }
else if( a[1]!='9' ){ a[1]='9'; }
else if( a[2]!='9' ){ a[2]='9'; }
}
// 999-A < B-100
else{
if ( b[0]!='1' ){ b[0]='1'; }
else if( b[1]!='0' ){ b[1]='0'; }
else if( b[2]!='0' ){ b[2]='0'; }
}
printf( "%d\n", (int)(atol(a)-atol(b)) );
return 0;
}
他の方のコードを見ていたら、
あまりにも美しい書き方を見つけてしまったので真似して書いてみた
#include <stdio.h>
int main(){
int a, b;
scanf("%d %d", &a, &b);
if(999-a > b-100){
a = (900 > a) ? a%100+900 : (990 > a) ? a%10+990 : 999;
}else{
b = (b > 199) ? b%100+100 : (b > 109) ? b%10+100 : 100;
}
printf("%d\n", a-b);
return 0;
}
まとめ
・コメントとコードで食い違わないように気を付ける…
・三項演算子は賛否両論あるらしいが、良し悪しは置いておいてサクッと使えるようにはなりたい
引き続き、のんびり精進します。