WARush

SRMの結果とか、解けた問題のコードを書いていきます

Codeforces #184 Div2 A 「Strange Addition」

問題

http://codeforces.com/contest/305/problem/A

残念な事に、バーシヤは、10進数表記での任意の桁の位置に、少なくとも'0'がひとつあるような( a, b )でのみ、足し算する事ができる。例えば、バーシヤは505と50ならば足し算できるが、1と4はできない。

バーシヤはk個の互いに異なる正の整数 d1, d2, .... dk.を持っている。

バーシヤは任意の2つの数を選んだときに足し算が出来るような、数字のセットをここから選びたい。このルールを守って選んだとき、最大何個のセットが出来るかを出力せよ。

制約

1 <= k =< 100
1 <= k_i <= 100



考えた事

0, 100は何も考えずに選んでおk
5, 30とか1ケタ目と2ケタ目が干渉しないのがあればベスト

事後

さすがにその計算力はまずいぞバーシヤ


ソースコード

int main() {
    int N;
    cin >> N;

    int a[110];
    for( int i = 0; i < N; i++ ){
        cin >> a[i];
    }

    bool use_1 = false;
    bool use_2 = false;
    bool use_12_find = false;
    int use_12_num = -1;
    int res = 0;

    int nums[4];
    int size = 0;
    
    for( int i = 0; i < N; i++ ){
        if( a[i] == 0 ){
            nums[size++] = 0;            
        }else if( a[i] == 100 ){
            nums[size++] = 100;
        }else if( !use_1 && a[i] < 10 ){
            use_1 = true;
            nums[size++] = a[i];
        }else if( !use_2 && a[i] % 10 == 0 ){
            use_2 = true;
            nums[size++] = a[i];
        }else{
            use_12_find = true;
            use_12_num = a[i];
        }        
    }

    if( use_12_find && !use_1 && !use_2 ) nums[size++] = use_12_num;

    cout << size << endl;
    for( int i = 0; i < size; i++ ){
        cout << nums[i] << " ";
    }
}