壁打ちAtCoder

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

AtCoder Beginner Contest 072 by C

AtCoder Beginner Contest 072 について
C言語での回答

atcoder.jp

できたもの
A
B
C

できなかったもの
D

問題A

#include <stdio.h>

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

    if(x>=t){
        printf("%d\n",x-t);
    }
    else{
        printf("0\n");
    }
    
    return 0;
}

最初X[g]で1秒に1g落ちるのでt秒後にはt[g]落ちます。よってX-t。
マイナスにはならないので、差が負になった場合にはif文で0にします。

問題B

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

int main(void){
    char s[100001];
    int i;
    scanf("%s", s);
    int size = strlen(s);

    for(i=0;i<size;i=i+2){
        printf("%c", s[i]);
    }
    
    return 0;
}

文字列から奇数番目を抜き出す、つまり文字配列の添え字を0→2→4...として出力すればいいです。
i=i+2;で2ずつ増えます。

問題C

#include <stdio.h>

int main(void){
    int n,i,j;
    int a;
    int count[100010]={0};
    scanf("%d", &n);
    
    for(i=0;i<n;i++){
        scanf("%d", &a);
        count[a-1]++;
        count[a]++;
        count[a+1]++;
    }

    int max = 0;
    for(i=0;i<100010;i++){
        if(max<count[i]){
            max = count[i];
        }
    }

    printf("%d", max);
    
    return 0;
}

入力された数字について、-1した値、+1した値、何もしなかった値の中でもっともカウントが多い値が答え。


値を配列で受け取った後、n^2で一致するかどうか確認するとTLEでした。
(N<=10^5なので当然)
しかし上の解法のきっかけになったのでやはりまずは総当たりは大事?

#include <stdio.h>

int main(void){
    int n,i,j;
    int a[100001];
    int count[1000001]={0};
    scanf("%d", &n);
    
    for(i=0;i<n;i++){
        scanf("%d", &a[i]);
    }

    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            if(a[j]==a[i]||a[j]==a[i]+1||a[j]==a[i]-1){
                count[i]++;
            }
        }
    }

    int max = 0;
    for(i=0;i<n;i++){
        if(max<count[i]){
            max = count[i];
        }
    }

    printf("%d", max);
    
    return 0;
}

問題D

#include <stdio.h>

int main(void){
    int n,i;
    int p[100001] = {0};
    int count = 0;
    scanf("%d", &n);

    for(i=0;i<n;i++){
        scanf("%d", &p[i]);
    }
  
    for(i=0;i<n;i++){
        if(p[i]==i+1){
            count++;
            i++;
        }
    }

    printf("%d", count);
    
    return 0;
}

pi==i+1の場合、i+1の値に関わらずiとi+1を交換。そうすれば異なります。
交換した場合、i++を付ければi+1を処理済みとしてi+2に移れるので重複しません。

解けなかった原因

i+1が0の場合と1の場合とでiの増加の値を変えていたため、添え字の変化やp[n-1]の扱いなどが分からなくなってしまった。