joi予選はランチの後で
TRANSCRIPT
短きこといとおかし
~The shorter it is,the greater it is.~
今回のJOI予選は難しかった。
だから短くしようと思う
第一問
第一問 問題要約
5つの入力をテキトーに処理して
最小値とって演算しなさい
第一問 アルゴリズム
最小値を取って演算アルゴリズムなんてない
第一問 16+
b,c,d,e;main(a){
5つの変数とmain関数
第一問 16+35+
scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
5つの入力
第一問 16+35+45
printf("%d\n",a=fmin(a,b>c?c:b)+d>e?e:d-50);}
最小値+最小値ー50 を出力代入はfminの戻り値のint型へのキャスト
第一問 16+35+45 =96
[EOF]
第一問
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);}
第一問
96byte
第二問
第二問 問題要約
チーム番号と数値をやるから大小関係気にしながら
点数上げていけしかるのち 順位をつけろ
第二問 アルゴリズム
チームに得点を加点していく得点で加点する
チーム1から順番に探しながら出力同得点の順位のやりくりもそれとなくする
第二問 45+
a,b,c,d,t[999];m(int*x){a=*1[&x]-*x;}
main(i){
変数、降順compare、main
第二問 45+121+
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);
iを入力してもらうEOFまで入力を受ける
a,bのindexをつける 点数から加点をテキトーに処理をする
第二問 45+121+17+
qsort(t+2,i,8,m);
tをt[2]からi個8個分(int*2)のアドレスを
mをもとにソート
※あたかもpair<int,int>
第二問 45+121+17+82
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];}
a(チーム番号)b(実際の順位)
c(同位考えない順位)d(第b位の点数)
を適当に回しながら出力
第二問 45+121+17+81=265
[EOF]
第二問
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]);}
第二問
264byte
第三問
第三問 問題要約
数字を与えるからソートして
コスパが良くなるように貪欲に処理しろ
第三問 アルゴリズム
値段を降順ソートしてコスパが悪くならない限り
足し続ける
第三問 43+
b,c,d,p[100];m(int*x){d=*x-*1[&x];}
main(a){
変数、降順compare、main
第三問 43+53+
for(scanf("%*d%d%d%d",&a,&b,&c);~scanf("%d",p+d++););
入力処理
第三問 43+53+46+
for(qsort(p,d,4,m);c/a<=p[--d]/b;a+=b)
c+=p[d];
ソートしてコスパがいい限り
足し続ける
第三問 43+53+46+18
printf("%d",c/a);}
出力
第三問 43+53+46+18 =160
[EOF]
第三問
b,c,d,p[100];m(int*x){d=*x-*1[&x];}main(a){for(scanf("%*d%d%d%d",&a,&b,&c);~scanf("%d",p+d++););for(qsort(p,d,4,m);c/a<=p[--d]/b;a+=b)c+=p[d];printf(%d",c/a);
第三問
160byte
第四問
第四問 問題要約
飽き性なんで3日くらいを気にしながら
DPしろ
第四問 26+
j,t[999][999],n,p;main(i){
変数定義main関数
第四問 26+58+
for(scanf("%d%*d",&n);~scanf("%d",&p);
scanf("%d",t[p+1]));
pで日時t[p+1]に種類を代入
入力処理
第四問 26+58+175+
for(i=n+3;(j%=64)||--i;t[j++][i]%=10000)for(p=1;p<4&!(i-n-2?j>15?j%21?t[j][i]=t[j/4+*t[i+1]*16][i+1]:5:0:
++t[j][i]);)t[j][i]+=!!((j+p*16)%21)*t[(j/4)%4+p++*4+*t[i+1]*16][i+1];
なんやかんやでDP
第四問 26+58+175+
DPのなかみ
1. N日目2. N、N-1、N-2の3日分の状況
で深さ優先探索からのDPNは100までN、N-1、N-2は4種類が3つで64種類
第四問 26+58+40+
DP部のテクニック
● 2日前、前日、本日の状態を4進数で一つにする● 0が未決定、1、2、3は種類● 111,222,333になってはならない● つまり111で割りきれてはならない● 十進数で21で割り切れるかどうかで判断● DPなので000の存在も注意● x%21&!xで対処
第四問 26+58+175+29
printf("%d",t[*t[2]*16][2]);}
出力
第四問 26+58+175+29=288
[EOF]
第四問
j,t[999][999],n,p;main(i){for(scanf("%d%*d",&n);~scanf("%d",&p);scanf("%d",t[p+1]));for(i=n+3;(j%=64)||--i;t[j++][i]%=10000)for(p=1;p<4&!(i-n-2?j>15?j%21?t[j][i]=t[j/4+*t[i+1]*16][i+1]:5:0:++t[j][i]);)t[j][i]+=!!((j+p*16)%21)*t[(j/4)%4+p++*4+*t[i+1]*16][i+1];printf("%d",t[*t[2]*16][2]);}
第四問
288byte
第五問
第五問 問題要約
長方形みたいに入力するけど六角形だよ
壁を数えてね
第五問 アルゴリズム
ただの再帰
第五問 18+
l[999][999],i,j,h;
変数
第五問 18+130+
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;}
第五問 18+130+
再帰関数
自分で自分を6つ呼び出す
第五問 18+130+
再帰関数なかみ
1. [0,0]からはじめて2.まわりの6つに突き進みながら3.壁に激突したら1返す4.いたってふつう
第五問 18+130+75+
main(w){for(scanf("%d%d",&w,&h);j++-h;)for(i=0;i++-w;scanf("%d",&l[i][j]));
main関数入力処理
第五問 18+130+75+20+
printf("%d",s(0.));}
出力
ん?
第五問 18+130+75+20+
s(0.)�
なにこれ?sの宣言はint s(a,b)
引数少なくね?
曖昧な型宣言
●sの引数の型宣言がわりと適当●こ●引数の数が違っててもスルー●そのかわりちゃんとbをとろうとする●a,bはint型になる●「0.」はdouble型●メモリ的にはa,bが共に0●やったね!
第五問 18+130+75+20+
printf("%d",s(0.));}
出力
第五問 18+130+75+20=243
[EOF]
第五問
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.));}
第五問
243byte
第六問
第六問 さすがに無理だわ
5重for文が出てくる感じshortcodingしたくない
よってしない
最後に
縮めるの楽しいね
縮めたら頭が柔軟になる
アルゴリズムに強くなる言語仕様に強くなる
みんなshortcodingしよーぜ
ブログよろしく
今回のコードは私のブログ「赤い黒歴史を蓄積する」
に乗ってます
ご清聴ありがとうございます
Thank you for listening.