joi予選はランチの後で

64
短きこといとおかし ~The shorter it is,the greater it is.~

Upload: ken-ogura

Post on 31-May-2015

264 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: JOI予選はランチの後で

短きこといとおかし

~The shorter it is,the greater it is.~

Page 2: JOI予選はランチの後で

今回のJOI予選は難しかった。

だから短くしようと思う

Page 3: JOI予選はランチの後で

第一問

Page 4: JOI予選はランチの後で

第一問 問題要約

5つの入力をテキトーに処理して

最小値とって演算しなさい

Page 5: JOI予選はランチの後で

第一問 アルゴリズム

最小値を取って演算アルゴリズムなんてない

Page 6: JOI予選はランチの後で

第一問 16+ 

b,c,d,e;main(a){

5つの変数とmain関数

Page 7: JOI予選はランチの後で

第一問 16+35+

scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);

5つの入力

Page 8: JOI予選はランチの後で

第一問 16+35+45

printf("%d\n",a=fmin(a,b>c?c:b)+d>e?e:d-50);}

最小値+最小値ー50 を出力代入はfminの戻り値のint型へのキャスト

Page 9: JOI予選はランチの後で

第一問 16+35+45 =96

[EOF]

Page 10: JOI予選はランチの後で

第一問 

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);}

Page 11: JOI予選はランチの後で

第一問

96byte

Page 12: JOI予選はランチの後で

第二問

Page 13: JOI予選はランチの後で

第二問 問題要約

チーム番号と数値をやるから大小関係気にしながら

点数上げていけしかるのち 順位をつけろ

Page 14: JOI予選はランチの後で

第二問 アルゴリズム

チームに得点を加点していく得点で加点する

チーム1から順番に探しながら出力同得点の順位のやりくりもそれとなくする

Page 15: JOI予選はランチの後で

第二問 45+

a,b,c,d,t[999];m(int*x){a=*1[&x]-*x;}

main(i){

変数、降順compare、main

Page 16: JOI予選はランチの後で

第二問 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をつける   点数から加点をテキトーに処理をする

Page 17: JOI予選はランチの後で

第二問 45+121+17+ 

qsort(t+2,i,8,m); 

tをt[2]からi個8個分(int*2)のアドレスを

mをもとにソート

※あたかもpair<int,int>

Page 18: JOI予選はランチの後で

第二問 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位の点数)

を適当に回しながら出力

Page 19: JOI予選はランチの後で

第二問 45+121+17+81=265

[EOF]

Page 20: JOI予選はランチの後で

第二問

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]);}

Page 21: JOI予選はランチの後で

第二問

264byte

Page 22: JOI予選はランチの後で

第三問

Page 23: JOI予選はランチの後で

第三問 問題要約

数字を与えるからソートして

コスパが良くなるように貪欲に処理しろ

Page 24: JOI予選はランチの後で

第三問 アルゴリズム

値段を降順ソートしてコスパが悪くならない限り

足し続ける

Page 25: JOI予選はランチの後で

第三問 43+

b,c,d,p[100];m(int*x){d=*x-*1[&x];}

main(a){

変数、降順compare、main

Page 26: JOI予選はランチの後で

第三問 43+53+

for(scanf("%*d%d%d%d",&a,&b,&c);~scanf("%d",p+d++););

入力処理

Page 27: JOI予選はランチの後で

第三問 43+53+46+

for(qsort(p,d,4,m);c/a<=p[--d]/b;a+=b)

c+=p[d];

ソートしてコスパがいい限り

足し続ける

Page 28: JOI予選はランチの後で

第三問 43+53+46+18

printf("%d",c/a);}

出力

Page 29: JOI予選はランチの後で

第三問 43+53+46+18 =160

[EOF]

Page 30: JOI予選はランチの後で

第三問

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);

Page 31: JOI予選はランチの後で

第三問

160byte

Page 32: JOI予選はランチの後で

第四問

Page 33: JOI予選はランチの後で

第四問 問題要約

飽き性なんで3日くらいを気にしながら

DPしろ

Page 34: JOI予選はランチの後で

第四問 26+

j,t[999][999],n,p;main(i){

変数定義main関数

Page 35: JOI予選はランチの後で

第四問 26+58+

for(scanf("%d%*d",&n);~scanf("%d",&p);

scanf("%d",t[p+1]));

pで日時t[p+1]に種類を代入

入力処理

Page 36: JOI予選はランチの後で

第四問 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

Page 37: JOI予選はランチの後で

第四問 26+58+175+ 

DPのなかみ

1. N日目2. N、N-1、N-2の3日分の状況

で深さ優先探索からのDPNは100までN、N-1、N-2は4種類が3つで64種類

Page 38: JOI予選はランチの後で

第四問 26+58+40+ 

DP部のテクニック

● 2日前、前日、本日の状態を4進数で一つにする● 0が未決定、1、2、3は種類● 111,222,333になってはならない● つまり111で割りきれてはならない● 十進数で21で割り切れるかどうかで判断● DPなので000の存在も注意● x%21&!xで対処

Page 39: JOI予選はランチの後で

第四問 26+58+175+29

printf("%d",t[*t[2]*16][2]);}

出力

Page 40: JOI予選はランチの後で

第四問 26+58+175+29=288

[EOF]

Page 41: JOI予選はランチの後で

第四問 

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]);}

Page 42: JOI予選はランチの後で

第四問

288byte

Page 43: JOI予選はランチの後で

第五問

Page 44: JOI予選はランチの後で

第五問 問題要約

長方形みたいに入力するけど六角形だよ

壁を数えてね

Page 45: JOI予選はランチの後で

第五問 アルゴリズム

ただの再帰

Page 46: JOI予選はランチの後で

第五問 18+

l[999][999],i,j,h;

変数

Page 47: JOI予選はランチの後で

第五問    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;}

Page 48: JOI予選はランチの後で

第五問 18+130+

再帰関数

自分で自分を6つ呼び出す

Page 49: JOI予選はランチの後で

第五問 18+130+ 

再帰関数なかみ

1. [0,0]からはじめて2.まわりの6つに突き進みながら3.壁に激突したら1返す4.いたってふつう

Page 50: JOI予選はランチの後で

第五問 18+130+75+

main(w){for(scanf("%d%d",&w,&h);j++-h;)for(i=0;i++-w;scanf("%d",&l[i][j]));

main関数入力処理

Page 51: JOI予選はランチの後で

第五問 18+130+75+20+

printf("%d",s(0.));}

出力

Page 52: JOI予選はランチの後で

ん?

Page 53: JOI予選はランチの後で

第五問 18+130+75+20+

s(0.)�

なにこれ?sの宣言はint s(a,b)

引数少なくね?

Page 54: JOI予選はランチの後で

曖昧な型宣言

●sの引数の型宣言がわりと適当●こ●引数の数が違っててもスルー●そのかわりちゃんとbをとろうとする●a,bはint型になる●「0.」はdouble型●メモリ的にはa,bが共に0●やったね!

Page 55: JOI予選はランチの後で

第五問 18+130+75+20+

printf("%d",s(0.));}

出力

Page 56: JOI予選はランチの後で

第五問 18+130+75+20=243

[EOF]

Page 57: JOI予選はランチの後で

第五問

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.));}

Page 58: JOI予選はランチの後で

第五問

243byte

Page 59: JOI予選はランチの後で

第六問

Page 60: JOI予選はランチの後で

第六問  さすがに無理だわ

5重for文が出てくる感じshortcodingしたくない

よってしない

Page 61: JOI予選はランチの後で

最後に

Page 62: JOI予選はランチの後で

縮めるの楽しいね

縮めたら頭が柔軟になる

アルゴリズムに強くなる言語仕様に強くなる

みんなshortcodingしよーぜ

Page 63: JOI予選はランチの後で

ブログよろしく

今回のコードは私のブログ「赤い黒歴史を蓄積する」

に乗ってます

Page 64: JOI予選はランチの後で

ご清聴ありがとうございます

Thank you for listening.