壁打ちAtCoder

AtCoderの問題をひたすら解いてくブログです。思考やコードの書き方の私的備忘録として

AtCoder Beginner Contest 055 by C

AtCoder Beginner Contest 055の問題について
C言語での回答。

atcoder.jp

できたもの

  • A
  • B
  • C

できなかったもの

  • D

解説
https://img.atcoder.jp/arc069/editorial.pdf

問題A

#include <stdio.h>

int main(void){
    int n;
    scanf("%d", &n);

    int eat = n*800;
    int get = n/15*200;

    printf("%d", eat-get);

    return 0;
}

とりあえず支払う金額は食べた回数×800円。
15回ごとに200円返ってくるので、返ってくる回数は食べた回数を15で割って小数点を切り捨てたもの。
int型であれば小数点以下は切り捨てになるので割ってしまえばおしまい。
差を求めて出力。

問題B

#include <stdio.h>

#define divide 1000000007

int main(void){
    int n,i;
    long int power = 1;
    scanf("%d", &n);

    for(i=1;i<n+1;i++){
        power = power * i;
        power = power%divide;
    }

    printf("%ld",power);

    return 0;
}

文を読んで、i回目にi倍すればよし。
最後にまとめて割ろうとすると桁あふれで途中から変な数値になってしまうので毎回割るようにします(他の問題で勉強になりました)。
これは下10桁が残ります(int型の範囲とオーダーが同じ)。
他でも使えそう大事なポイント。

問題C

#include <stdio.h>

int main(void){
    long long n,m;
    scanf("%lld %lld", &n,&m);

    long long count = 0;

    if(m>2&&n<=m/2){
        count = n;
        count = count + (m-2*n)/4;
    }
    else if(m>2&&n>m/2){
        count = m/2;
    }

    printf("%lld", count);

    return 0;
}

cピース2つでsピースは作れるけどその逆は出来ないので、方針としては
1.cピースの数が2個未満なら0。
2.sピースの数>=cピースの数/2であれば作れるのはc/2組。
3.sピースの数'<'cピースの数/2であれば、まずs個組み合わせを作る。
cピースの残りはc-2*s個。
sccを1組作るにはcピースが4個必要なので4で割って小数点以下を切り捨て。

問題D

まだ。
解説を元にもう少し考えてみます。

やりたかったことと近い他の方の解答
https://atcoder.jp/contests/abc055/submissions/2910923