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 とかしか思いついてなかった...)
今日も小さいことだけど学びがありました(おしまい)