AtCoder Beginner Contest 081を解きました

前回に引き続きです
これのD問題は解説見たらわかったので気が向いたら書きます...

続きを読む

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

いつもの如くコードはCです。
Haskellで書けたら強いと思うんで勉強中です。
A問題は駐車料金の最小値を求める問題。
特に言うことはないですが、やや行儀よく書きすぎていて、4行ぐらい削減できそうです。
p1 = ...からの部分を、printfの引数のところに比較文を放り込めばそれだけでよさそうです。
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;
    }

最近関数型で書いてるせいか、手続き型言語でも関数を量産する癖がついてます。
digitsumは各位の和を求める関数で、hjdはハジャッド数かどうかを判定する関数です。
main関数の方でNのdigitsumをとってNで割った余りを調べればhjd丸ごといらなくなるんですが、hjdを作っている途中でdigitsumがサブルーチンとしているなあと思ったのでその名残です。
defaultで Error なんか出力しようとしてるのは関数型特有のパターン潰しの癖です。

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通りのパターンを潰しているだけです。
少なくとも1日以上営業するという制約なので、一日も営業しない日を潰さなくてはいけないので、day配列がすべて0のときだけありったけの小さい数を返すようにしました。ややメタですが、入力の数字的にこの-2000000000が最大値を超えることはないです。なんとなく動的計画法を意識した書き方になってるのは、最初はそういう問題だと思ったからです...。

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

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

keyの代表作『AIR』の聖地、美浜町に行ってきました。
18きっぷの日帰りで名古屋←→和歌山は相当シビアで、現地滞在時間は2時間もなかったです。

ローカル線紀州鉄道西御坊駅。非常に短い区間を走っています。一時間に一本しか電車がないので結局この路線は使用せず、自力で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』の舞台を探訪しに行きました。
いろいろトラブルはあったけど楽しかったです。
続きから↓

続きを読む

しょーもないプログラム

#include<stdio.h>

int main()
{
  int i;
  while(1){
    printf("\x1b[41m");
    printf("\x1b[30m");
    printf("すぐにけせ");
  }
  return 0;
}

ターミナルの出力の色変えられるんですね...
某ゲームの都市伝説的なアレ