問題はこちら
No.256 桁の数字を入れ替え (2) - yukicoder
任意に並び替えられるので元の並びは関係ない
なので各数字がいくつ登場するかを記録して、大きい数から上位に配置していけば良い
int main(){ int a[10],i; char s[100010]; gets(s); for(i=0;s[i];i++)a[s[i]-'0']++; for(i=9;i>=0;i--)while(a[i]){putchar('0'+i);a[i]--;} return 0; }
ささっと書き換えて
a[11]; main(t){ for(;t=getchar()-10;a[t-37]++); //indexを1つずらして'0'の個数をa[1]に、…'9'の個数をa[10]に保存 for(t=11;--t;)for(;a[t]--;)putchar(47+t); }
まず後半部分は
for(t=10;a[t+47]--?putchar(47+t):--t;);
と圧縮できる。
前半はgetcharでなくreadで読み込みをすることにする
このとき、読み込み終了時にtが10となっていることを利用して後半の初期化がサボれる
a[60];main(t){for(;read(0,&t,1);a[t]++);for(;a[t+47]--?putchar(47+t):--t;);}
for文圧縮+配列サイズのごまかし
a[];main(t){for(;read(0,&t,1)?++a[t]:a[t+47]--?putchar(47+t):--t;);}
68B