2011年7月14日木曜日

CodeForces Beta Round #76 Div2 Only

A
Restoring Password
日本語でおk

B
Friends
Passed System Test


5人の人間が居て、誰と誰が知り合いか、という情報が与えられる。
知り合い同士の3人グループが存在するか、互いに全く知り合いでない3人グループが存在する場合 WIN と、そうでない場合 FAIL と出力せよ

解法
やるだけ

#include <iostream>
#include <vector>
#include <string>
#include <string.h>
#include <map>
#include <set>
#include <algorithm>
#include <time.h>
#include <cmath>
#include <queue>

#define REP(i,s,e) for(int i = s;i<e;i++)
#define rep(i,e) REP(i,0,e)

using namespace std;


int main(){
    int pair[6][6];
    memset(pair,0,sizeof(pair));
    int n;
    cin>>n;
    int a,b;
    rep(i,n){
        cin>>a>>b;

        pair[a][b] = 1;
        pair[b][a] = 1;
    }
    int count[2];
    REP(i,1,6){
        memset(count,0,sizeof(count));
        REP(j,1,6){
            if(i==j) continue;
            if(pair[i][j]) count[0]++; else count[1]++;
        }
        if(count[0] >= 3 || count[1] >= 3){
            cout << "WIN" << endl;
            return 0;
        }
    }
    cout << "FAIL" << endl;

}

Problem C
Frames
Passed System Test


PC上にあるディレクトリ削除の問題
全部n個のフォルダが、m列まで並べられる空間に並べられている。

11個のフォルダを3列に並べる場合

1 2 3
4 5 6
7 8 9
10 11

こんな感じ

a番目からb番目にあるフォルダを全て削除したい。
Shiftキーを押しながら選択することで、複数のフォルダからなる矩形を作成することが出来、矩形に含まれるフォルダは一度に削除することが可能。
全て削除するまでに、何回の操作が必要か?

解法
やるだけ。と言いたいところだが。
前提条件から、操作回数は3以下。
そして、削除すべきフォルダの存在する行数が3以上の場合、考慮すべき問題は全て3
行の時と変わらなくなる。
後は考えられる条件を全て挙げていけば良い。

コード


#include <iostream>
#include <vector>
#include <string>
#include <string.h>
#include <map>
#include <set>
#include <algorithm>
#include <time.h>
#include <cmath>
#include <queue>

#define REP(i,s,e) for(int i = s;i<e;i++)
#define rep(i,e) REP(i,0,e)
#define ll long long

using namespace std;

int main(){
    ll n,m,a,b;
    cin>>n>>m>>a>>b;
    ll column = (b-1)/m - (a-1)/m;
    ll row_a = a%m;
    ll row_b = b%m;
    if(m == 1){
        cout << 1 << endl;
        return 0;
    }
    switch(column){
    case 0:
        cout << 1 << endl; // 一行で済む場合
        return 0;
    case 1:
        if(row_a == 1 && (row_b == 0 || n == b)){ // 二行だが、一回で囲えてしまう場合
            cout << 1 << endl;
            return 0;
        }
        cout << 2 << endl; // そうではない場合
        return 0;

    default: // 三行以上の場合
        if(row_a == 1 && (row_b == 0 || n==b)){ // 一回で全て囲えてしまう場合
            cout << "1" << endl;
            return 0;
        }else if( (a-1)%m == b%m || row_b == 0 || row_a == 1 || b == n){ //
            cout << 2 << endl;
            return 0;
        }
        cout << 3 << endl;
        return 0;
    }


}

Rating 1367 → 1483
かなり上昇しました。
あと、Wrong Answerの場合、正解した時に取得出来るスコアが減少するということを知りました。
次から気を付けてやりたいと思います。

最近は時間が合わず、コンピティションになかなか参加出来ていません。
上手く時間を作って行きたいものです

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。