問題はこちら
No.476 正しくない平均 - yukicoder
やるだけ
入力が全て整数なので、平均×個数=合計 となっているかどうかで調べると、小数を使わずに済む
10^9*10=10^10>2^32なので32bitでは足りない事に注意(撃墜ケースも用意されている)
int main(){ int a,n,s,i,x; scanf("%d%d",&n,&a); s=0; for(i=0;i<n;i++){ scanf("%d",&x); s+=x; } puts((long)n*a==s?"YES":"NO"); return 0; }
さて、できるだけ変数を減らすことを考えると、n,aを特別扱いせずにまとめてしまいたい。
やるべきことは n*a-(残りの和) が0かどうかを判断することなので
1回目 s=x
2回目 s*=x
3回目以降 s-=x
とすればよさそう
long s,x; main(i){ for(;~scanf("%d",&x);--i?~i?s-=x:(s*=x):(s=x)); x=!puts(s?"NO":"YES"); }
最初の代入をちょっと工夫するとすこし縮む
long s,x; main(i){ for(;~scanf("%d",--i?&x:&s);~i?s-=x:(s*=x)); x=!puts(s?"NO":"YES"); }
やはり3分岐が長く見える
そこでこれをどうにかまとめる方法がないか考えると
最初 s=1
1,2回目 s*=x
3回目以降 s-=x
とすれば良いことに気付く
long s=1,i; main(x){ for(;~scanf("%d",&x);++i<3?s*=x:(s-=x)); i=!puts(s?"NO":"YES"); }
82B
ちなみにカッコを外してみても同じ長さになる
++i<3?s*=x:(s-=x) s+=++i<3?~-x*s:-x
sがintでよければ、mainの第1引数にすることで初期化が省略できるので更に縮むのだけど。
ゴルフに際しては、過去にどこかでにたような問題を見たことがあったので、わりと簡単に縮めることができた
2017/07/29追記
>ちなみにカッコを外してみても同じ長さになる
いいえ
コンパイラのバージョンアップによる3Bと合わせて5B短縮
long s=1,i; main(x){ for(;~scanf("%d",&x);s=++i<3?s*x:s-x); puts(s?"NO":"YES"); }
77B