2012年12月13日木曜日

AOJをといた

いくつかといたので

AOJ 0031
重さが2のべき乗の錘で対象物とつりあいをとる感じだった気が
#include<iostream>
using namespace std;
 
int main(void){
    int N, ans;
    while(cin >> N){
        for(int i = 0; i < 10; i++){
            if(N & 1){
                ans = 1 << i;
                cout << ans;
                if(N >> 1)
                    cout << ' ';
            }
            N >>= 1;
        }
        cout << endl;
    }
}

ようやくビット演算を覚えた。今までなぜやらなかったのか。
if(N >> 1)とか頭いいことやってるコードあったんでパクった。

AOJ 0032
平行四辺形の2辺と対角線から長方形とひし形を数えろって問題。
#include<iostream>
using namespace std;
 
int main(void){
    int a,b,c;
    char temp;
    int hisi = 0, cho = 0;
    while(!cin.eof()){
        cin >> a >> temp >> b >> temp >> c;
        if(a*a + b*b == c*c)
            cho++;
        if(a == b)
            hisi++;
    }
    cout << cho << endl << hisi << endl;
}
最初見たときはよく分からずに放置したけど、単純に2辺が同じならひし形だし三平方の定理で長方形も分かる。

AOJ 0033
上から降ってくる1~10の玉を左右に振り分けて降順にするみたいな問題
#include<iostream>
#include<queue>
using namespace std;
 
int main(void){
    queue<int> que;
    int b,c,n;
    cin >> n;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < 10; j++){
            cin >> b;
            que.push(b);
        }
        b = c = 0;
        bool flag = false;
        while(!que.empty()){
            if(que.front() > b){
                b = que.front();
                que.pop();
            }else if(que.front() > c){
                c = que.front();
                que.pop();
            }else{
                flag = true;
                break;
            }
        }
        if(flag){
            cout << "NO" << endl;
        }else{
            cout << "YES" << endl;
        }
    }
}
単純にキュー使って左に入らなかったら右に入れるだけでおk。
最初は左右と落ちてくるボールの差が小さい方に入れようとしたけど、左右の内大きい方が差が小さくなるのは自明だし、それ以前に左に入れていって入らなかったら右に入れるようにすれば右の方が小さいのは明らか。

AOJ 0500
ついにJOIの問題に挑戦
AとBのプレイヤーがカードを1枚ずつ出して、大きい数字を出した方に2枚の数字の合計だけ点が入るので、それぞれの得点を求める。
int main(void){
    int n;
    int a,b,c,d;
    while(cin >> n, n !=0){
        a = 0; b = 0;
        for(int i = 0; i < n; i++){
            cin >> c >> d;
            if(c > d)
                a += c + d;
            else if(d > c)
                b += c + d;
            else{
                a += c;
                b += d;
            }
        }
        cout << a << ' ' << b << endl;
    }
    return 0;
}

引き分けたら両方に1枚ずつってのを見逃しててWAくらった。

0 件のコメント:

コメントを投稿