AtCoder Beginner Contest 080を解きました

AtCoder Beginner Contest 080を解きました
いうてもD問題がまだ解けない
==
A問題
A: Parking - AtCoder Beginner Contest 080 | AtCoder

#include<stdio.h>
 
int main()
{
  int res,N,A,B,p1,p2;
  scanf("%d %d %d",&N,&A,&B);
  p1 = A * N;
  p2 = B;
  res = p1 > p2 ? p2 : p1;
  printf("%d\n",res);
  return 0;
}

printf("%d\n", A*N > B ? B : A*N)
でよかったかも

B問題
B: Harshad Number - AtCoder Beginner Contest 080 | AtCoder

    #include<stdio.h>
     
    int digitsum(int N)
    {
      if(N == 0)
        return 0;
      else
        return ((N % 10) + digitsum(N / 10));
     
    }
     
    int hjd(int N)
    {
      if(N % digitsum(N) == 0)
        return 1;
      else
        return 0;
    }
     
    int main()
    {
      int N;
      scanf("%d",&N);
      switch(hjd(N)){
      case 0 :
        printf("No\n");
        break;
      case 1 :
        printf("Yes\n");
        break;
      default :
        printf("Error\n");
        break;
      }
      return 0;
    }

関数作りすぎたかも

C問題
C: Shopping Street - AtCoder Beginner Contest 080 | AtCoder

    #include<stdio.h>
    int N,F[101][6][3],P[101][11];
    int max(int x, int y)
    {
      return x > y ? x : y;
    }
    int daynum(int n,int day[11])
    {
      int i,j,res=0;
      for(i=1;i<=5;i++)
        for(j=1;j<=2;j++)
          res += day[2*(i-1)+j]*F[n][i][j];
      return res;
    }
     
    int isZero(int day[11])
    {
      int i;
      for(i=1;i<=10;i++)
        if(day[i] != 0)
          return 0;
      return 1;
     
    }
     
    int rieki(int day[11],int date){
      if(date == 11){
        int n,res=0;
        if(isZero(day))
          return -2000000000;
        for(n=1;n<=N;n++)
          res += P[n][daynum(n,day)];
        return res;
      }else{
        int i,d1[11],d2[11];
        for(i=1;i<=10;i++)
          d1[i] = d2[i] = day[i];
        d1[date] = 1;
        d2[date] = 0;
        return max(rieki(d1,date+1),rieki(d2,date+1));
      }
    }
     
    int main()
    {
      int day[11],i,j,k,res;
      scanf("%d",&N);
      for(i=1;i<=N;i++)
        for(j=1;j<=5;j++)
          for(k=1;k<=2;k++)
            scanf("%d",&F[i][j][k]);
      for(i=1;i<=N;i++)
        for(j=0;j<=10;j++)
          scanf("%d",&P[i][j]);
      for(i=0;i<=10;i++)
        day[i] = 0;
      printf("%d\n",rieki(day,1));
      return 0;
    }

関数めちゃくちゃ作りすぎました。
長々と書いてますがやってることは1024通りのパターンを潰しているだけです。一日も営業しない日を潰さなくてはいけないので、day配列がすべて0のときだけありったけの小さい数を返すようにしました。

D問題ができたらまた書きます。

AIRの聖地和歌山県御坊市美浜町に行ってきました

keyの代表作『AIR』の聖地、美浜町に行ってきました。

ローカル線紀州鉄道西御坊駅。非常に短い区間を走っています。一時間に一本しか電車がないので結局この路線は使用せず、自力でJR御坊駅から浜まで歩いていきました。
f:id:xxxasdfghjk999:20170901122112j:plain
西御坊駅のすぐ前にあるAIRのOPで登場する廃線跡。原作では線路がつながっていましたが、安全措置のためか途切れていました。
f:id:xxxasdfghjk999:20170901122108j:plain
往人と観鈴が歩いた道。
f:id:xxxasdfghjk999:20170901122103j:plain
煙樹ヶ浜。時間の関係ですみからすみまで回れず、適当に堤防にこれを置いて撮影しました。
f:id:xxxasdfghjk999:20170901122057j:plain

鎌倉に行ってきました

夏休みなので旅行に行ってきました。
行き先は鎌倉です。
主にP.A.WORKSのアニメ『TARI TARI』の舞台を探訪しに行きました。
いろいろトラブルはあったけど楽しかったです。
続きから↓

続きを読む

Haskellでフィボナッチメモ化再帰

さっき挙げたプログラムだとfib(40)ぐらいでもう数十秒ぐらいかかり、だいぶ遅いです。
メモ化再帰フィボナッチをメモしておきます

fib 0 = 0
fib 1 = 1
fib x =  (fiblist !! (x-1) + fiblist !! (x-2))
fiblist = [fib x  | x <- [0,1..]]

実行結果

ghci> fib 5000
3878968454388325633701916308325905312082127714646245106160597214895550139044037097010822916462210669479293452858882973813483102008954982940361430156911478938364216563944106910214505634133706558656238254656700712525929903854933813928836378347518908762970712033337052923107693008518093849801803847813996748881765554653788291644268912980384613778969021502293082475666346224923071883324803280375039130352903304505842701147635242270210934637699104006714174883298422891491273104054328753298044273676822977244987749874555691907703880637046832794811358973739993110106219308149018570815397854379195305617510761053075688783766033667355445258844886241619210553457493675897849027988234351023599844663934853256411952221859563060475364645470760330902420806382584929156452876291575759142343809142302917491088984155209854432486594079793571316841692868039545309545388698114665082066862897420639323438488465240988742395873801976993820317174208932265468879364002630797780058759129671389634214252579116872755600360311370547754724604639987588046985178408674382863125

5000項目でも一瞬で計算できます。多倍長標準実装スゴイ。

Haskellでフィボナッチ数列

さっそくHaskellでプログラミングしています
なかなか新鮮でおもしろいですね

fib 1 = 1
fib 2 = 1
fib x = fib (x-1) + fib (x-2)

実行結果

ghci> fib 8
21
ghci> fib 10
55

Cで書いてもこんなもんですけどHaskellだと簡潔に書けますね

いろいろ買い物&スタジオ作りました

今日は街に行ってフィギュアの撮影スタジオの材料とかを買いに行きました。
ついでに夏休みに使う予定の青春18きっぷも買っておきました!!たのしみです
東急ハンズで買い物しましたが、いろいろなものがあって目移りしましたね。
理化学コーナーにビーカーやらいろいろな実験用具が売っていて、専攻は違えどなかなかわくわくしました。
結局あまり買わなかったんですけどまた行きたいです。
さらに大きい書店に寄ってコンピュータの棚をみてると、関数型言語Haskellの参考書『すごいHaskellたのしく学ぼう!』、
(通称すごいH本)が売っていたのでなかなか値は張りましたが買ってしまいました。関数型言語はまだ触れたことがないので楽しみです。
f:id:xxxasdfghjk999:20170727192027j:plain

うちに帰ったら早速スタジオを作りました。
ダンボールの床と壁に白い紙を貼り、上からUSB給電のLED光源で照らすだけの簡素なものです。
ダンボールの切り出しに苦戦しつつも完成しました。(わりとでかい
↓こんな漢字
f:id:xxxasdfghjk999:20170727192344j:plain

↓こんな漢字
f:id:xxxasdfghjk999:20170727193959j:plain

上から照らしてるだけなので正面からも照らしたいんですが、直接当てると影がなかなか目立ちます。
角のほうの影もちょっと問題なのでそのへんを直していきたいです