Isa@Diary

ソフトウェア開発やってます。プログラミングとか、US生活とかについて書きます。

Codeforces Round #102(Div.2)

結果

ooox- +0 2514pts(90th)
1552 -> 1661(+109)

Div.1まであと39! & Highest更新

問題

A

1 <= a,b,c,d <= 9 なので全探索すればよし。
あとはすべて異なる整数であることを忘れずに。
(ソースがとても汚い)

int main(){

    int r1,r2,c1,c2,d1,d2;

    cin >> r1 >> r2 >> c1 >> c2 >> d1 >> d2;

    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
            for(int k=1;k<=9;k++){
                for(int l=1;l<=9;l++){
                    if(i + j == r1 &&
                       k + l == r2 &&
                       i + k == c1 &&
                       j + l == c2 &&
                       i + l == d1 &&
                       j + k == d2 &&
                       i != j &&
                       i != k &&
                       i != l &&
                       j != k &&
                       j != l &&
                       k != l){
                        cout << i << " " << j << endl;
                        cout << k << " " << l << endl;
                        return 0;
                    }
                }
            }
        }
    }
    cout << -1 << endl;
    return 0;
}
B

実装ゲー。3桁区切りのコンマは下の位から作ってreverseするようにした.

int main(){
    string str;
    cin >> str;
    bool minus = false;
    bool dot = false;
    int flac_cnt = 0;
    vector<char> digit;
    string digit_res = "";
    vector<char> flac;
    
    for(int i=0;i<str.size();i++){
        if(str[i] == '-'){
            minus = true;
        }else if(str[i] == '.'){
            dot = true;
        }else if(dot == false){
            digit.push_back(str[i]);
        }else if(flac_cnt < 2){
            flac.push_back(str[i]);
            flac_cnt++;
        }
    }

    for(int i=0;i<digit.size();i++){
        digit_res += digit[digit.size() - 1 - i];
        if(i % 3 == 2 && i != digit.size() - 1){
            digit_res += ",";
        }
    }
    reverse(digit_res.begin(), digit_res.end());

    if(minus){
        cout << "(";
    }
    cout << "$";
    cout << digit_res;
    cout << ".";
    if(flac.size() == 0){
        cout << "00";
    }else if(flac.size() == 1){
        cout << flac[0] << "0";
    }else{
        cout << flac[0] << flac[1];
    }
    if(minus){
        cout << ")";
    }
    cout << endl;
    return 0;
}
C

n = a*b*cと表せるとき

mini = min((a+2)*(b+2)*(c+1), (a+2)*(b+1)*(c+2), (a+1)*(b+2)*(c+2)) - n;
maxi = max((a+2)*(b+2)*(c+1), (a+2)*(b+1)*(c+2), (a+1)*(b+2)*(c+2)) - n;

を計算すればよい。a,b,c,の組み合わせは
curt()を立方根としてa=b=c=curt(n)まで調べればよく、bはsqrt(n/a)まで調べればよく、cはn/(a*b)が割りきれれば求まるので結果としてo(curt(n)*sqrt(n))ですべてのa,b,cの組を列挙できる。

誤差か初期化ミスか解らないけど1回Pretestで落ちた。

int main(){
    ll n;
    ll cbrt;
    ll mini = 8e+18;
    ll maxi = -1;
    cin >> n;

    for(ll i=0;i*i*i <= n; i++){
        cbrt = i;
    }

    for(ll i=1;i<=cbrt;i++){
        for(ll j=i;j<=sqrt(((double)n + 1e-7)/i + 1e-7);j++){
            if(n % (i*j) == 0){
                ll k = n / (i*j);
                printf("i = %lld, j = %lld, k = %lld\n",i,j,k);
                mini = min(mini, (i+2) * (j+2) * (k+1) - n);
                maxi = max(maxi, (i+2) * (j+2) * (k+1) - n);
                mini = min(mini, (i+2) * (j+1) * (k+2) - n);
                maxi = max(maxi, (i+2) * (j+1) * (k+2) - n);
                mini = min(mini, (i+1) * (j+2) * (k+2) - n);
                maxi = max(maxi, (i+1) * (j+2) * (k+2) - n);
            }
        }
    }
    cout << mini << " " << maxi << endl;
}
D

1回hackされて、System testで落ちた。桂馬飛びの位置に置いてはいけない、というのはすぐ解った。
(ChessだとKnightなんですね)
基本市松模様に配置すれば良いはずで、1列の時は全部置ける→hacked
ああ、2*2の時は全部置けるのか→Failed System Test

2*5の時には

■■□□■
■■□□■

で6個置けるんですね…2*2に気づいたならこれも考えたかったですね。

感想

次回落ちる気しかしないけどがんばりたい。