C++の練習を兼ねて, AtCoder Regular Contest 052 の 問題A (何期生?) ~ 問題B (円錐) を解いてみた.
■感想.
1. 問題B は, 累積和で処理できたので, 何とかAC版に到達できた.
2. 時間を見つけて, 引き続き, 過去問を振り返っていきたいと思う.
本家のサイトAtCoder Regular Contest 052 解説をご覧下さい.
■C++版プログラム(問題A/AC版).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <bits/stdc++.h> using namespace std; #define repex(i, a, b, c) for(int i = a; i < b; i += c) #define repx(i, a, b) repex(i, a, b, 1) #define rep(i, n) repx(i, 0, n) #define repr(i, a, b) for(int i = a; i >= b; i--) int main(){ // 1. 入力情報. char S[22]; scanf("%s", S); int l = strlen(S); // 2. 何期生か? int ans = 0; rep(i, l) if(S[i] >= '0' && S[i] <= '9') ans = 10 * ans + (S[i] - '0'); // 3. 出力. printf("%d\n", ans); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[入力例] chokudai55 [出力例] 55 ※AtCoderのテストケースより [入力例] cho9dai [出力例] 9 ※AtCoderのテストケースより [入力例] atcoder52 [出力例] 52 |
■C++版プログラム(問題B/AC版).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#include <bits/stdc++.h> using namespace std; #define repex(i, a, b, c) for(int i = a; i < b; i += c) #define repx(i, a, b) repex(i, a, b, 1) #define rep(i, n) repx(i, 0, n) #define repr(i, a, b) for(int i = a; i >= b; i--) const double PI = acos(-1.0); double cone[20202][111], cones[20202]; int main(){ // 1. 入力情報. int N, Q; scanf("%d %d", &N, &Q); // 2. 円錐の体積を集計. rep(i, N){ double x, r, h; scanf("%lf %lf %lf", &x, &r, &h); // 円錐全体の体積. double tVol = r * r * PI * h / 3.0; // 円錐を輪切りにして体積を保存. repx(j, (int)x, 20202){ if(j > (int)(x + h)){ cone[j][i] = tVol; }else{ double cr = r * (double)(x + h - j) / h; // 半径. cone[j][i] = tVol * (1.0 - (cr * cr * cr) / (r * r * r)); } } } // 3. 累積和を計算. rep(i, N) rep(j, 20202) cones[j] += cone[j][i]; // 4. クエリに回答. rep(i, Q){ int A, B; scanf("%d %d", &A, &B); printf("%.6lf\n", cones[B] - cones[A]); } return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
[入力例] 10 10 3 3 3 2 1 1 5 2 3 1 5 6 2 9 3 4 6 12 11 18 5 4 15 25 0 2 3 1 1 7 0 1 0 2 0 10 3 10 0 100 3 8 1 5 2 9 3 4 6 9 [出力例] 8.843002 80.992182 4173.878112 3865.997282 8512.668894 2882.971997 1227.377293 3629.490541 114.081013 1747.545749 ※AtCoderのテストケースより [入力例] 5 5 5 10 10 4 100 100 3 1000 1000 2 1000 1000 1 1000 1000 0 3 2 1000 4 314 3 217 5 432 [出力例] 9409079.422279 3139502408.531295 2100737789.465234 1613523459.243475 2532621914.444282 ※AtCoderのテストケースより |
■参照サイト
AtCoder Regular Contest 052