メモ

yukicoderでゆるふわgolf

yukicoder No.512 魔法少女の追いかけっこ

問題はこちら
No.512 魔法少女の追いかけっこ - yukicoder

追いかける側がA[i]地点にあるi番目の交差点にたどり着いた時、追いかけられる側はA[i]/X*Y地点にいる。これがA[i+1]より真に大きければ見失う。
除算をすると誤差で落とされるケースが多数あるらしいので、A[i]/X*Y≦A[i+1]をA[i]*Y≦A[i+1]*Xと変形して整数の範囲でやる

a[100],x,y,n;
main(){
	scanf("%d%d%d",&x,&y,&n);
	for(int i=0;i<n;i++)scanf("%d",a+i);
	for(int i=0;i<n-1;i++)if(a[i]*y>a[i+1]*x){
		puts("NO");
		return 0;
	}
	puts("YES");
}

前から順番に読み込めば配列はいらない

p,q,f;
main(a,b){
	for(scanf("%d%d%*d",&a,&b);~scanf("%d",&q);p=q)f|=a*q<b*p;
	puts(f?"NO":"YES");
}

94B

scanfを1つにするパターンも考えたが、Nの読み飛ばしが難しくて短くならなかった

p,q,f;main(a,b){for(scanf("%d%d%*d",&a,&b);~scanf("%d",&q);p=q)f|=a*q<b*p;puts(f?"NO":"YES");}
a,b,p,q,f;main(i){for(;~scanf("%d",&q);*(--i?~i?i+2?&p:&q:&b:&a)=q)f|=a*q<b*p;puts(f?"NO":"YES");}
a,b,p,q,f;main(i){for(;~scanf("%d",&q);~i--?i>-2?a=b,b=q:(p=q):0)f|=a*q<b*p;puts(f?"NO":"YES");}

2017/08/01追記
やっぱりscanfを1つにしたほうが短くなった

a,b,p,q,f;
main(i){
	for(;~scanf("%d",a?b?&q:&b:&a);--i+2?p=q:0)f|=a*q<b*p;
	puts(f?"NO":"YES");
}

92B