2012年9月9日日曜日

PCKに参加してきた。

AOの書類出し終わってひと段落したので、PCK参加しました。
結果→3完。惨敗。
とりあえず書いたソースコード貼ってく。

問1:10個の整数入力して合計を出す。」
#include<iostream>
using namespace std;

int main(void){
        int ans = 0, n;
        
        for(int i = 0; i < 10; i++){
                cin >> n;
                ans += n;
        }
        
        cout << ans << endl;
        
        return 0;
}
やるだけ。
去年の過去問ちょっと見てたからビックリした。

問2:3ケタのビットパターン入力して条件にあった出力を変えす
#include<iostream>
using namespace std;
int main(void){
        int n,b1,b2,b3;
        
        cin >> b1 >> b2 >> b3;
        n = b1 * 100 + b2 * 10 + b3;
        
        if(n == 110 || n == 1){
                cout << "Open" << endl;
        }else{
                cout << "Close" << endl;
        }
        
        return 0;
}
これもやるだけ。これに関してはもうちょっといい感じに実装できるんじゃないかと思った。
問4:すべての数字は6174になるらしい。これもやるだけ。
#include<iostream>
#include<algorithm>
using namespace std;


int main(void){
        int n,ans,temp;
        int L[4];
        while(cin >> n && n){
                //init
                ans = 0;
                
                while(n != 6174){
                        L[0] = n / 1000;
                        n = n % 1000;
                        L[1] = n / 100;
                        n = n % 100;
                        L[2] = n / 10;
                        n = n % 10;
                        L[3] = n;
                        
                        if(L[0] == L[1] && L[1] == L[2] && L[2] == L[3]){
                                ans = -1;
                                break;
                        }
                        
                        for(int i = 0; i < 3; i++)
                                for(int j = i + 1; j < 4; j++)
                                        if(L[i] > L[j]){
                                                temp = L[j];
                                                L[j] = L[i];
                                                L[i] = temp;
                                        }
                        
                        
                        //cout << L[0] << L[1] << L[2] << L[3] << "end" << endl;
                        
                        n = (L[3] * 1000 + L[2] * 100 + L[1] * 10 + L[0]) - (L[0] * 1000 + L[1] * 100 + L[2] * 10 + L[3]);
                        
                        ans++;
                }
                if(ans == -1){
                        cout << "NA" << endl;
                }else{
                        cout << ans << endl;
                }
        }
        return 0;
}
実装下手くそか!
最初はsort関数とか使ってた(algorithmヘッダ置きっぱなしだけど)けどなんか上手く行かないんでとりあえずバブルソートしといた。
WA2回食らった。

実際提出できたのはここまで。3完で16点。ブルーコーダーとは思えぬ点数の低さ。
まぁ直前まで受験で忙しかったししょうがないよね。

以下、提出できなかったもの
問3:等差数列にノイズが入っててそれを見つけて返すだけ。
#include<stdio.h>
using namespace std;
int main(void){
        int d[101],c[101];
        int ans,n,k,s;
        bool f;
        scanf("%d",&n);
        while(n){
                ans = -1;
                for(int i = 0; i < 101; i++){
                        d[i] = c[i] = 0;
                }
                n++;
                
                for(int i = 0; i < n; i++){
                        scanf("%d",&d[i]);
                }

                
                fflush(stdin);
                
                for(int i = 0; i < n; i++){
                        
                        int k = 0;
                        for(int j = 0; j < n; j++){
                                if(j == i){
                                        continue;
                                }
                                c[k] = d[j];
                                k++;
                        }
                        s = c[1] - c[0];
                        f = true;
                        for(int j = 1; j < n - 2; j++){
                                if(c[j + 1] - c[j] != s){
                                        f = false;
                                        break;
                                }
                        }
                        if(f){
                                ans = i;
                                break;
                        }
                }
                
                printf("%d\n",d[ans]);
                scanf("%d",&n);
        }
        return 0;
}
実装下手でーす。
とりあえず配列から一つ除いて全体がいい感じになればそれが雑草なので普通に全探索っぽく。
実際の競技では"j ⁢ n - 2"のとこ"n - 1"にしててWA食らう。
結局気づいたのは終了5分後。

問8:ユビート
やるだけじゃんとか思ってた。
#include<cstdio>
using namespace std;
int main(void){
        int n, c;
        int a[30][16], b[30][16];
        int ans,buf,pts,bufi;
        
        scanf("%d%d",&n,&c);
        while(n){
                for(int i = 0; i < n; i++){
                        for(int j = 0; j < 16; j++){
                                scanf("%d",&a[i][j]);
                        }
                        fflush(stdin);
                }
                for(int i = 0; i < c; i++){
                        for(int j = 0; j < 16; j++){
                                scanf("%d",&b[i][j]);
                        }
                        fflush(stdin);
                }
                
                ans = 0;
                for(int i = 0; i < n; i++){
                        pts = 0;
                        for(int j = 0; j < n; j++){
                                buf = 0;
                                for(int k = 0; k < 16; k++){
                                        if(a[i][k] == 1 && b[j][k] == 1){
                                                buf += 1;
                                        }
                                }
                                if(buf > pts){
                                                pts = buf;
                                                bufi = j;
                                }
                        }
                        ans += pts;
                        for(int j = 0; j < 16; j++){
                                if(a[i][j] == 1 && b[bufi][j] == 0){
                                        a[i + 1][j] = 1;
                                }
                        }
                }
                
                printf("%d\n",ans);
                
                scanf("%d%d",&n,&c);
        }
        return 0;
}
「光ったパネルは押されるまで光り続けます」
DPじゃん!

というわけで、最初で最後のPCKはもう散々って感じだった。敗因はもうスキル不足でしょ。去年の秋からずっとまじめにやってたら普通に本選行けるレベルだった。



0 件のコメント:

コメントを投稿