壁打ちAtCoder

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

AtCoder Beginner Contest 043 by C

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

atcoder.jp

できたもの

  • A

できなかったもの

  • B
  • C
  • D

問題A

#include <stdio.h>

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

    int calc = 0;
    for(i=0;i<n;i++){
        calc = calc + n-i;
    }

    printf("%d", calc);

    return 0;
}

1+2+・・・+nを計算します
プログラムではnから順にn-1 +・・・+1としました

問題B

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

int main(void){
    char s[10];
    int ans[10];
    int i,j;
    scanf("%s", s);

    for(i=0;i<10;i++){
        ans[i] = 2;
    }

    for(i=0;i<10;i++){
        if(s[i]=='0'){
            ans[i] = 0;
        }
        else if(s[i]=='1'){
            ans[i] = 1;
        }
        else if(s[i]=='B'){
            for(j=1;j<11;j++){
                if(ans[10-j]!=2){
                    ans[10-j]=2;
                    break;
                }
            }
            /*if(ans[i-1]!=2){
                ans[i-1] = 2;
            }*/
        }
    }

    for(i=0;i<10;i++){
        if(ans[i]!=2){
            printf("%d", ans[i]);
        }
    }

    return 0;
}

文字がBの時の処理がうまくいかず、他の方の正答を参考に書きました。
if文の書き方ではある1つのテストケースを抜けられず、また原因も分かっていません。

問題C

#include <stdio.h>

int main(void){
    int n;
    int str[100];
    int i,j;
    long k;
    long min = 9999999999;

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

    for(i=-100;i<=100;i++){
        long k = i;
        long sum = 0;
        for(j=0;j<n;j++){
            sum += (str[j]-k)*(str[j]-k);
        }
        if(sum<min){
            min = sum;
        }
    }

    printf("%ld\n", min);

    return 0;
}

取り得る値を全てxに代入して計算し、最小値和minを求めます。

問題D

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

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

    //XX
    for(i=1;i<size;i++){
        if(str[i]==str[i-1]){
         printf("%d %d", i,i+1);   
        return 0;
        }
    }

    //XOX
    for(i=2;i<size;i++){
        if(str[i]==str[i-2]){
            printf("%d %d", i-1,i+1);
            return 0;
        }
    }

    printf("-1 -1");
    return 0;
}

文字列において、ある何らかのアルファベットを"X""O"としたときに、同じ文字が過半数以上を占めるためには文字列中に同じ文字が並ぶ箇所があるか(XX)一文字挟んで同じ文字の箇所がある(XOX)必要があります。というのも間に二文字以上入ってしまうと文字列の過半数を占めることができないからです。

というわけでそのどちらかを満たす箇所があるか調べ、あった場合にはその個所を、なければ-1 -1を出力します。

解答では文字の先頭から1,2...とカウントするのに対し、文字列の添え字は0,1...なことに注意。
例えば例1の"needed"では、文字配列中で条件を満たす部分文字列はs[1]とs[2]ですが、出力する場合には2 3とする必要があります。