JOI予選は昼飯のあとで

どうも JOI予選がありましたね。もちろん参加しましたー。結果はまだワカンネ。
予選問題も公開されていますので感想でも述べようかと。

第一問

入力が3つと2つと変則的なせいで本当に実装するだけの問題になってしまった。
shortcodeが面白くない。

b,c,d,e;main(a){scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);b=!printf("%d\n",a=fmin(a,b>c?c:b)+d>e?e:d-50);}
第二問

ただの足し算かとおもいきや順位をつけろとの要求。pairを作ってsortするもいいがCではpairを使うには実装しないといけない。
面倒くさすぎる、これは例年の第三問並の面倒くささ。先が思いやられる。
結果的に点数を集計して、違う配列にmemcpyしてsortし順位をつけるという回りくどいことをすることになった。
shortcodeしたくない。400byte  ソースコード割愛
全然そんなことなかった qsortの真価に気づきましたよ本当に。

a,b,c,d,t[999];
m(int*x){a=*1[&x]-*x;}
main(i){
	for(scanf("%d",&i);~scanf("%d%d%d%d",&a,&b,&c,&d);t[a*2+1]=a,t[b*2+1]=b)
		c==d?t[a*2]++,t[b*2]++:c>d?t[a*2]+=3:(t[b*2]+=3);
	qsort(t+2,i,8,m);
	for(a=b=0;a++<i;printf("%d\n",b))
		for(c=d=0;t[++c*2]-d?b=c:1,t[c*2+1]-a;d=t[c*2]);
}

265byte!テキトーなんできっともっと縮まります。
shortcodeたのすぃー!

第三問

まさかのここにきて貪欲法。第二問と第三問、順番逆ではないのか。
shortcodeしごたえはあるものの縮まらない。

b,c,d,p[100],e;
m(int*x){e=*x-*1[&x];}
main(a){
	for(scanf("%*d%d%d%d",&a,&b,&c);~scanf("%d",p+d++););
	qsort(p,d,4,m);
	for(;c/a<=p[--d]/b;a+=b)
		c+=p[d];
	printf("%d",c/a);
}
第四問

はいきたDP。案の定きた動的計画法。予選中は前2日と後2日とその日の5つを渡すというめんどくさいコードを書きましたが良く考えると前2日とその日だけでよかったんで短くかける。ただ残念なことに入力を一旦保存する必要があるのでそれだけ変数が増える。
shortcodeたのしい。

p,n,i,t[999][999];
main(){
for(scanf("%d%*d",&n);~scanf("%d%d",&p,&i);*t[p]=i);
for(i=n+3;--i;)for(p=64;p--;t[p][i]%=10000)
i-n-2?p/16?t[p%16][i]+=t[p][i]=p%21?t[*t[i]*16+p/4][i+1]:0:0:t[p][i]++;
n=!printf("%d\n",t[*t[1]*16][2]);
}

4進数でbitmapな感じで情報を渡してるんで扱いやすい。
最後の二重for文をむりやり一つにしたら1byteへるはず。
225byte

第五問

究極の作業ゲー
手でやることをPCにやらせてるだけにすぎない。そしてまさかの6角形。予選中はスルーしますた。
そして今でもまだ解いてません。解きたくない。
きっとshortにならない。
shortになった。

l[999][999],i,j,h;
s(a,b){
	h=l[a][b];
	h=h-1?h-2&~a&~b&a+~i&b+~j?l[a][b--]=2,s(a-b%2,b)+s(a+1-b%2,b)+s(a-1,++b)+s(a+1,b)+s(a-b%2,++b)+s(a+1-b%2,b):0:1;
}
main(w){
	for(scanf("%d%d",&w,&h);j++-h;)
		for(i=0;i++-w;scanf("%d",&l[i][j]));	
	printf("%d",s(0.));
}

242byteです。なんと今回の6問のなかで3番目の短さ。

第六問

ジグザグ数ってなんだよ。結果的に条件に当てはまる数列を数えるにすぎない。
ただ難点は倍数と範囲。あと長さ。
倍数は剰余を渡すだけで解決するが、作った数列が指定された範囲内か判断するのが大変。
数列の長さ、剰余、ジグかザグか、上限より小さいか、下限より大きいかの5つでメモ化ですかねー。
と思いましたが時間がなかったので1番だけ解いて終わりました。
こんど実装してみよう。
shortcodingしがいがありそう。

以上

今回の問題は作業ゲーが多かったですね。第一問の3個と2個という実装ゲー、第二問の順位付け、第五問の存在、 などいろいろ面倒くさかったですね。

追記:第六問

一応解きました。しかし縮めてません。

6次元配列のメモ化という鬼畜仕様。これをDPしたら6重for文になると思うとぞっとする。
5番目のinputでだいたい6秒くらい。合ってるかどうかは知らん。