2>/dev/null

ふぉれんじっくやさんになりたいです

ABC130の考察と復習

AtCoderのコンテストに初参加した話

  1. 問題
  2. 結果
  3. 考察と改善点

1.問題

https://atcoder.jp/contests/abc130

ざっと見た感じ400まではいけそうだと感じた。(できるとは言ってない)

2.結果

100点しかとれなかった(泣)

3.考察と改善点

  • A - Rounding

X,A は 0 以上 9 以下の整数です。

X が A 未満の時 0A 以上の時 10 を出力してください。

  1. #include<stdio.h>
  2. int main(){
  3. int x=0,a=0;
  4. scanf("%d%d",&x,&a);
  5. if(x<a) printf("0\n");
  6. else if(x>=a) printf("10\n");
  7. return 0;
  8. }

 

さすがにこれは解けました。(これ解いた後、謎の腹痛に襲われてタイムロス)

  • B - Bounding

問題文

数直線上を N+1 回跳ねるボールがあり、1 回目は 座標 D1=0i 回目は 座標 Di=Di1+Li1(2iN+1) で跳ねます。

数直線の座標が X 以下の領域でボールが跳ねる回数は何回でしょうか。

制約

  • 1N100
  • 1Li100
  • 1X10000
  • 入力は全て整数である

入力

入力は以下の形式で標準入力から与えられる。

N X
L1 L2 ... LN1 LN

最初問題文よく理解できなかったけど、たいして難しくない(というよりかは、真正面から解こうとするよりかはいかに表面をくみ取り、数学的に処理するかと考えた方が楽)と思った。

  1. #include<stdio.h>
  2. #define N 100
  3. int main(){
  4. int n,x,l[N],d[N];
  5. int i,cnt=0;
  6. d[0]=0;
  7. scanf("%d%d",&n,&x);
  8. for(i=0;i<n;i++){
  9. scanf("%d",&l[i]);
  10. d[i+1]=d[i]+l[i];
  11. if(d[i]<=x) cnt++;
  12. }
  13. printf("%d\n",cnt);
  14. return 0;
  15. }

第一段階。

コンパイルも通ったし、WAも2ケースしか出ていない。すぐ終わるやろ。と調子に乗っている状況。原因も良く分かっていない。(結局こいつに時間取られて他の問題ろくに見もしなかった。)後、scanf記述する際、メモリ参照忘れるクセ直した方がよい。

 

  1. //thank you for plain
  2. #include<stdio.h>
  3. #define N 100
  4. int main(){
  5. int n,x,l[N],d[N+1];
  6. int i,cnt=0;
  7.  
  8. scanf("%d%d",&n,&x);
  9. d[0]=0;
  10. for(i=0;i<n;i++){
  11. scanf("%d",&l[i]);
  12. d[i+1]=d[i]+l[i];
  13. }
  14. for(i=0;i<=n;i++){
  15. if(d[i]<=x) cnt++;
  16. }
  17. printf("%d",cnt);
  18. return 0;
  19. }

 

第二段階。

これ一生懸命直してるときに、全く同じ変数使って書いてたplainさんには感謝。(意図的なのかどうかは定かではない。)

…………………………………今見返したら、「X 以下の領域で」と明記されていた。

問題としては、漸化式の処理はx回目を含まないように記述していたが、x回目を含む処理をするカウンタ部分の実装も一緒にぶち込んでたのが原因だと発覚した。〇してぇ…原因わかったのですっきり

~~とりあえず今はここまで、時間できたら再開します