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

君はまるで砂漠に咲く、一輪の花。

僕はその花に引き寄せられる蝶。

Codeforces Beta Round #1

最終更新:2015/01/27 はい。
http://codeforces.com/contest/1

A. Theatre Square

math

ざっくり大意

・Berland市のTheatreの庭、面積nmがある。
・a
aの石を使って最小の個数で庭を敷き詰める。

方針のようなもの

・問題文3行目らへんで敷き詰める石のほうが庭の広さを越えていいと書いてあるっぽい。

n,m,a=map(int,raw_input().split())
print ((n+a-1)/a)*((m+a-1)/a)
#include<iostream>
#include<cmath>
#include<string>
#include<cctype>
#include<vector>
#include<numeric>
#include<algorithm>
using namespace std;

int main(){
    long long n,m,a;
    scanf("%I64d %I64d %I64d",&n,&m,&a);
    printf("%I64d\n",((n+a-1)/a)*((m+a-1)/a));
    return 0;
}

B. Spreadsheets

implementation,math

ざっくり大意

・エクセルのようなスプレッドシート
・与えられるn行の入力は2種類ある
・BC23 BCは列、23は行
・R23C55 RはRow(行)、Cはcolumn(列)

方針のようなもの

解法を参照したのはItsLastDayさんの http://codeforces.com/contest/1/submission/602523

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import timeit
import time
import sys
import io
import re
import math

n=int(raw_input())
for i in range(n):
    m=raw_input()
#入力がR数値C数値であるかチェック
#元々はmatch=で書かれていたが、将来に使いまわす際にmatch文と衝突するので避けました。
    chk=re.search(r'R(\d+)C(\d+)',m)
    if chk:
#searchしてる1カ所目、2カ所目とか取り出せるのか??すげぇ
        x=int(chk.group(2))
        res=''
        while x:
#組み込み関数ordを要見直し
            res=chr(ord('A')+(x-1)%26)+res
            x=(x-1)/26
#行は数値取り出せれば何も加工する必要なし
        print (res+chk.group(1))
    else:
#ここもsearchを数値以外と数値のみを取り出す仕込みになっている
        t=re.search(r'(\D+)(\d+)',m)
        x=0
        for letter in t.group(1):
            x=x*26+(ord(letter)-ord('A')+1)
#行は取りさせれば加工する必要なし
#列はここもord()を
        print ('R%dC%d' % (int(t.group(2)), x))

C. Ancient Berland Circus

geometory,math

ざっくり大意

・Berlandは直径13mの競技場を持ってるが昔は違った。
・古代では正多角形の形であった。
・現在にも残っている3本の柱の座標から過去の競技場の最小の面積はいくつかを計算する。

方針のようなもの

・そうだ、写経しよう。 http://codeforces.com/contest/1/submission/3266

import math
def getlen(a,b):
    return math.sqrt((a[0]-b[0])*(a[0]-b[0])+(a[1]-b[1])*(a[1]-b[1]))
def dmul(a,b):
    return a[0]*b[0]+a[1]*b[1]
def tlen(a):
    return math.sqrt(a[0]*a[0]+a[1]*a[1])
lst=[]
for i in range(3):
    lst.append(map(float, raw_input().split()))
thea=[]
r=0
for i in range(3):
    v=[]
    for j in range(3):
        if j!=i:
            v.append([lst[j][0]-lst[i][0],lst[j][1]-lst[i][1]])
    ta=math.acos(dmul(v[0],v[1])/tlen(v[0])/tlen(v[1]))
    thea.append(ta)
    if i==0:
        r=tlen([lst[1][0]-lst[2][0],lst[1][1]-lst[2][1]])/2/math.sin(ta)
thea.sort()
for i in range(1,100):
    t=thea[0]/i
    ret=(math.pi/t)*r*math.sin(2*t)*r/2
    for j in range(1,3):
        f=math.fmod(thea[j],t)
        if 1e-6<f<t-1e-6:
            break
    else:
        break
print "%.8lf"%ret

getlenは2つの座標の距離を取ってるかな。他はまたじっくり解読を後で。