C++競プロ学習日記(仮)

( 学習記録であり解説Blogではないです )

ARC036 A - ぐっすり|AtCoder

A: ぐっすり - AtCoder Regular Contest 036 | AtCoderを解きました。
3回に渡ってコードを修正提出しました...。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,k,t,res{0},sum{0};
    vector<int> vc;
    cin >> n >> k;
    while(cin>>t){
        vc.push_back(t);
    }
    bool flag=true;
    for(int i=0; i<n; i++){
        sum=0;
        sum+=vc[i]+vc[i-1]+vc[i-2];
        if(i>1&&sum<k){
            res=i+1;
            flag=false;
            break;
        }
    }
    cout << (flag?-1:res) << endl;
    return 0;
}

1回目の提出
純粋に自分で解いたコードです。
vc[i]+vc[i-1]+vc[i-2]とする所でi=0の時、デバック時、和が変なのが気になってましたが、
和をcoutする訳ではないので気になりつつも提出してAC。

最適解を見るべく強い人のコードをチェック。
私のコード、凄く無駄が多かった事を知る(学び)
そして書き直し。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,k,t;
    vector<int> vc;
    cin >> n >> k;
    while(cin>>t){
        vc.push_back(t);
    }
    for(int i=0; i<n; i++){
        if(i>1&&vc[i]+vc[i-1]+vc[i-2]<k){
            cout << i+1 << endl;
            return 0;
        }
    }
    cout << -1 << endl;
    return 0;
}

2回目の提出
bool判定を消した。
それから、vc[i]+vc[i-1]+vc[i-2]の結果を変数に保存していたのですが、
if()の条件式の中にそのまま収め込んだ。
これだけでも大分スッキリした。

そして例外アクセスの件、やはりダメと言う事で再度修正。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,k,t;
    vector<int> vc;
    cin >> n >> k;
    while(cin>>t){
        vc.push_back(t);
    }
    for(int i=2; i<n; i++){ // i = 2 と修正
        if(vc[i]+vc[i-1]+vc[i-2]<k){
            cout << i+1 << endl;
            return 0;
        }
    }
    cout << -1 << endl;
    return 0;
}

3回目の提出
ループの開始自体を i = 2 からという発想は無かった...。
( if() で i > 1 とかしか思いついてなかった...)

今日も小さいことだけど学びがありました(おしまい)