カメヲラボ

主にプログラミングとお勉強全般について書いてます

Magnificent Meatballs

  • ミートボールを食いまくり


SamとEllaの二人が、テーブル上のミートボールを食い尽くす問題。ちょうど半分コできれば、そのポジションを。むりなら大喧嘩"No equal partitioning."と表示する。
これは、namasuteさん(http://d.hatena.ne.jp/namasute0/20060707#1152258595)がscanfを無理やり1回で済ますという大技を繰り出したので、それを参考に少しだけ削った。
計算方法はいたって単純で、値を読みながら合計値を計算。合計値からインプットの値の2倍を引く。ちょうど0になれば半分コ可能。負になれば大喧嘩失敗。ということになる。

a[99];i,j,c;
main(){
  for(;~scanf("%d",a+i);
   j?i=j=c=!printf(c-*a?"No equal partitioning.\n":
   "Sam%s%d and Ella%s%d.\n",i,j,i=" stops at position ",j+1):0)
    for(c+=a[i];++i>*a&c>*a;c-=a[++j]*2);
}

ちなみに、scanf2回で200Bを切ったときのコードは

 *a,z[];
s=" stops at position ";
main(c){
  for(;scanf("%d",a=z),*z;printf(c?"No equal partitioning.\n":
   "Sam%s%d and Ella%s%d.\n",s,a-z,s,a-z+1)){
    for(c=0;~--*z;c+=*a)scanf("%d",++a);
    for(;c>0;)c-=2**a--;
  }
}

ポインタを使うとz[]でもランタイムエラーを起こさなかった。gccはちょっとしたことでランタームエラーにならないことが結構あるので、頑張ったらもう少し縮むのではないかなぁと思う。