PKU3671 Dining Cows

問題の解法

Ozyさんのわかりやすい解説。
http://d.hatena.ne.jp/Ozy/20080731

コードの短縮過程

// 79B
a,b;main(n){for(;a<b?b=a:0,~scanf("%d",gets(&n));a+=n-1)b+=2-n;printf("%d",b);}

// AC 77B
a,b;main(n){for(;~scanf("%d",gets(&n));a<b?b=a:0)n>1?a++:b++;printf("%d",b);}

// AC 76B
a;main(b,n){for(gets(n);a<b?b=a:0,gets(n);)atoi()>1?a++:b++;printf("%d",b);}

// AC 73B
a;main(b,n){for(;~scanf("%d",&n);a<b?b=a:0)n>1?a++:b++;printf("%d",b-1);}

// AC 72B
b;main(a,n){for(;~scanf("%d",&n);a>b?b=a:0)n>1?a--:b--;printf("%d",-b);}

// AC 69B
b;main(a,n){for(;gets(n);a>b?b=a:0)atoi()>1?a--:b--;printf("%d",-b);}

// RE 66B
b;main(a){for(;gets();a>b?b=a:0)atoi()>1?a--:b--;printf("%d",-b);}

// AC 63B
b;main(a,n){for(;gets(n);)atoi()<2?b-=a<b:--a;printf("%d",-b);}

// AC 69B
a,b;main(n){for(gets(&n);gets();)atoi()<2?b+=a>b:++a;printf("%d",b);}

// AC 67B
b;main(a,n){for(;gets(n);)a<1&atoi()<2?b-=a<b:--a;printf("%d",-b);}

// AC 66B
b;main(a,n){for(;gets(n);)a<1>=atoi()?b-=a<b:--a;printf("%d",-b);}

// AC 63B
a,b;main(n,m){for(;gets(&n);m=2)n%m?b+=a>b:a++;printf("%d",b);}

// AC 63B
a,b;main(n){for(;gets(&n);)n=n<50?b+=a>b+1:a++;printf("%d",b);}

// 63B
a,b;main(m,n){for(;gets(&n);)n-50?n=b+=a>b:a++;printf("%d",b);}

// 63B
b;main(a,n){for(;gets(&n);)n-50?n=b+=-a<~b:a++;printf("%d",b);}

// 63B
b;main(a,n){for(;gets(&n);n=0)n<50?b+=-a>b:a--;printf("%d",b);}

// AC 61B
b;main(a,n){for(;gets(&n);n&a<1?b-=a<b:a--);printf("%d",-b);}

長いこと63Bで足踏みしていて、61Bのブレイクスルーきたー…と思ったら、
速攻でOzyさんに抜かれてしまって涙目、という(よくある)展開。

下から四番目の

a,b;main(m,n){for(;gets(&n);)n-50?n=b+=a>b:a++;printf("%d",b);}

が一番惜しい。一行目に2が来たら嫌だなーと思って、わざわざ第二引数にgetsしている。

最初の63Bのコードで、一行目が1でも偶然正しい答えを返すことに感動していて、
どんな入力でも動くということに夢中になっていた。
普段は平気で入力依存のコード書いているというのに。