AtCoder Beginner Contest 383 B問題

B - Humidifier 2

・S1,S2を決定

・全てのマトリクスから「.」を計算してtmpへ、最大ならansへ

・マンハッタン距離のd以内であること

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    int h, w, d;
    scanf("%d %d %d", &h, &w, &d);

    char s[100][101]; // 最大100x100の文字列を想定(改行文字を考慮し+1)
    for (int i = 0; i < h; ++i) {
        scanf("%s", s[i]); // 各行を読み込む
    }

    int ans = 0;
    for (int i1 = 0; i1 < h; ++i1) {
        for (int j1 = 0; j1 < w; ++j1) {
            if (s[i1][j1] == '#') continue; // 壁の場合スキップ

            for (int i2 = 0; i2 < h; ++i2) {
                for (int j2 = 0; j2 < w; ++j2) {
                    if (s[i2][j2] == '#' || (i1 == i2 && j1 == j2)) continue; // 壁または同じ位置

                    int tmp = 0;
                    for (int i = 0; i < h; ++i) {
                        for (int j = 0; j < w; ++j) {
                            if (s[i][j] == '.' && 
                                (abs(i - i1) + abs(j - j1) <= d || abs(i - i2) + abs(j - j2) <= d)) {
                                tmp++; // 加湿されているマスをカウント
                            }
                        }
                    }
                    if (tmp > ans) ans = tmp; // 最大値を更新
                }
            }
        }
    }

    printf("%d\n", ans); // 結果を出力
    return 0;
}

382のC - Kaiten Sushi

C - Kaiten Sushi

・a(美食度)入力時に誰が食べるのか、id[r](美食度)=(誰が食べるか)に入力する

・微妙にわからない

 

#include <stdio.h>

#define K 100

int main() {
    int n, m;
    int id[K];
    for (int i = 0; i < K; i++) {
        id[i] = -1;
    }

    scanf("%d %d", &n, &m);

    int r = K;
    for (int i = 0; i < n; i++) {
        int a;
        scanf("%d", &a);
        while (r > a) {
            --r;
            id[r] = i + 1;
        }
    }

    for (int i = 0; i < K; i++) {
        printf("%d ",id[i]);
    }
    
    for (int i = 0; i < m; i++) {
        int b;
        scanf("%d", &b);
        printf("%d\n", id[b]);
    }

    return 0;
}

ABC問題のB

B - Binary Alchemy

 

 

・再起関数かと思いきやfor文

    int ans = 0;
    for (int i = 0; i < n; i++) {
        if (ans >= i) {
            ans = a[ans][i];
        } else {
            ans = a[i][ans];
        }
    }
    ans++;

 

〇B - 3^A

  //k桁目に対応、3で割ることで上の桁へ

for (int k = 0; k <= 10; k++) {

       for (int i = 0; i < (M % 3); i++) {

     A[size++] = k; // 値を配列Aに追加し、sizeをインクリメント

       }

       M /= 3;

}

B - 1D Keyboard

abcの順にその配置番号を入れる

    for(int i=0;i<26;i++){
        x[s[i]-'A']=i;
    }
    int sum=0;
    for(int i=0;i<25;i++){
        sum+=abs(x[i+1]-x[i]);
    }

組込み現場の標準コーディングガイドライン

グローバル変数は極力避ける

 staticを付ける

 モジュール変数にする

・auto変数の初期化

・文字列は、可能なら文字列配列として扱う

 char型ポインタは、文字が格納されているのか、それても文字列が可能脳されているのかわからない

 char型ポインタを介した文字列捜査は、ほかの関係ないメモリ領域を破壊するリスクを伴う

 char型ポインタ「pc***」or「ps***」という名称にする

 文字なら「c」文字列なら「s」

・文字列リテラル長さはコンパイラに数えさせる

 char sWelcomeMsg="Hello!";

 //マクロ定数

 #define APPNAME "checker"

 char sErrorMsg=APPNAME":check error";

・文字列サイズにヌルを含むかどうか明確に

#define PROJCT_NAME_MAX_STRLEN 16 /*終端のヌルを含む*/

・偽:0、FALSE 真:0以外、TRUE

 enum Boolean { FALSE = 0, TRUE = 1}; //列挙体

・ポインタは、指しているデータ型の情報を含む

・ビットフィールドの使用

数値計算

 0除算してない?→割る数の確認、assertの使用

 途中計算を含めて、型の範囲に収まってる?→計算順序

 絶対値が極端に異なる浮動小数点の加減算ない?→絶対値の小さいものから、floatだけでなく、doubleの使用を検討

・キャストは、オペランド

 x = (long)(a+b);ではなく x = (long)a+(long)b;

 output_wave = input_wave * (double)(amp_factor/100);ではなく

 output_wave = input_wave * ((double)amp_factor/100);

 output_wave = input_wave * (amp_factor/100.0);

浮動小数点の比較に==は使わない

 #define EPS (0.0001)

 #define EQUAL(x,y) (fabs*1 < EPS)

  if( EQUAL(delta,0.0) ) {

  //収束した

  doSomething();

 }

浮動小数点の仮数は 1<=m<2

・数値であれば0と比較、論理式であれば0と比較しない

 数値:0  ==0  !=0の条件

 論理:FALSE そのまま書く、!で否定

 番地:NULL ==、!=

・ポインタ代入前・解放後にNULL(使用してはいけないアドレスが残っている)

・構造体メンバーにアクセスする関数を限定(引数は、ポインタとする)

・case 節では、break文で終わらせる

 例外の場合 /* 下の処理に続く */

・else節やdefaultラベル節を書き、考慮したことを明らかにする

・適切なループ文を選択

 for    :先頭で評価、繰り返し回数は固定

 while   :先頭で評価、繰り返し回数は不定

 do while :末尾で評価、繰り返し回数は不定

・ヘッダファイルに入れるもの

 〇 マクロ定義、構造体・教養体・列挙体の宣言、typedef、

   外部関数の宣言、外部変数の宣言

 × 変数や関数の定義

 全体、モジュール間、モジュール内のみで使うものに分ける

・ヘッダファイル内での多重宣言回避

 #ifndef **** //定義されていなければ

 #define **** //定義する

 #endif

 

 

 

 

*1:x)-(y

367 C問題

https://atcoder.jp/contests/abc367/tasks/abc367_c

 

#include <stdio.h>

int n, k;
int r[8];
int seq[8];

void solve(int lv) {
    if (lv == n) {
        int s = 0;
        for (int i = 0; i < n; i++) {
            s += seq[i];
        }
        if (s % k == 0) {
            for (int i = 0; i < n; i++) {
                if (i > 0) {
                    printf(" ");
                }
                printf("%d", seq[i]);
            }
            printf("\n");
        }
        return;
    }
    for (int i = 1; i <= r[lv]; i++) {
        seq[lv] = i;
        solve(lv + 1);
    }
}

int main() {
    scanf("%d %d", &n, &k);
    for (int i = 0; i < n; i++) {
        scanf("%d", &r[i]);
    }
    solve(0);
    return 0;
}