読者です 読者をやめる 読者になる 読者になる

純ブログ

ちょっとプログラミングしてる人のブログです。

競プロ日記: AtCoder Regular Contest 052

AtCoder Regular Contest 052 に参加しました。

結果は、1 完 (A 問題)、2 WA、 279 位 / 379 人*1でした。

A

解説通り。

また言語選択を忘れてしまい、2 WA してしまった。 前回もやったミスなので気を付けないと…。

ソースコード (C++14):

#include <iostream>
#include <string>

using namespace std;

int main() {
    string id;
    cin >> id;
    
    for (auto c : id) {
        if ('0' <= c && c <= '9') cout << c;
    }
    cout << endl;
    
    return 0;
}

arc052.contest.atcoder.jp

B

  • 円錐の中心が  {x} 軸上に来るものだと思い込んでいた。
  • いずれか 1 つの円錐の部分の体積を求めるのだと誤読してしまった。

体積を求めるところは合っていたので、解説を聞いてすぐに AC しました。

解法

与えられる円錐の高さが整数なので、各円錐について、高さ 1 ずつ輪切りにする感じで体積を求めて、足し合わせた。

ソースコード (C++14):

#include <iostream>
#include <vector>
#include <cmath>
#include <cstdio>

using namespace std;

double v[20000];

int main() {
    int N, Q;
    
    cin >> N >> Q;
    for (int i = 0; i < N; ++i) {
        int x, r, h;
        cin >> x >> r >> h;
        
        for (int j = 0; j < h; ++j) {
            double h1 = h - j, r1 = h1 * r / h;
            double h2 = h - j - 1.0, r2 = h2 * r / h;
            
            v[x + j] += M_PI * (r1 * r1 * h1 - r2 * r2 * h2) / 3.0;
        }
    }
    
    for (int i = 0; i < Q; ++i) {
        int a, b;
        cin >> a >> b;
        
        bool f = false;
        double V = 0;
        for (int j = a; j < b; ++j) {
            V += v[j];
        }
        
        
        printf("%.6f\n", V);
    }
    
    return 0;
}

arc052.contest.atcoder.jp


このあと 25 時からの Google Code Jam 2016 Round 1B にも出る予定です。

*1:​(最下位(380 位) − 1) 人