2011年6月26日日曜日

enchant.js で□ト□ス

enchant.jsを触ってみた。
中々面白い。

で、テ○リ○を作ってみた。

http://g-bs-p.appspot.com/

やりたい方はどうぞ。
ゲームオーバー画面は作ってません。

2011年6月21日火曜日

Google先生...

いつからか知らないが、Google先生が検索結果に出てきたページを何回閲覧したかという情報を残すようになっていた。

読者諸兄。エロサイトを見るときはログオフして使わないとな!
ちなみに僕はオキニのエロサイトを73回閲覧していたそうだ。

CodeForces Beta Round #74 Div2

報告です

A Cable Way
Passed System Test


R、G、Bそれぞれの乗り場にそれぞれr,g,b人の子供が居る。
この子供らを全員乗せ、山頂まで送り届けたい。
乗り場にケーブルカーが到着する度に、乗り場に居る生徒を二人までケーブルカーに載せることが出来る。
ケーブルカーはR→G→B→R→G→B。。。とぐるぐる回り、全員ケーブルカーに載せることが出来れば、そこから山頂へと出発する。
R乗り場からスタートし、各乗り場間の移動には一分、山頂まで行くにはどの乗り場からであっても30分かかる。
全員を載せて山頂に着くのは何分後か?



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


using namespace std;


bool check(int r,int g, int b){
    return (r>0||g>0||b>0);
}


int main()
{
    int r,g,b;
    cin>>r>>g>>b;
    int ans = 0;
    if(!check(r,g,b)){
        cout << ans << endl;
        return 0;
    }
    while(1){
        r-=2;
        if(!check(r,g,b)) break;
        ans++; g-=2;
        if(!check(r,g,b)) break;
        ans++; b-=2;
        if(!check(r,g,b)) break;
        ans++;
    }
    cout << ans+30 << endl;
}

B African Crossword
Passed System Test


n行m列の、全て小文字のアルファベットで構成されたクロスワードがある。
i行j列の文字は、同じ行、或いは同じ列に、同じ文字が無ければ出力される。
法則にしたがい文字を出力せよ。




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


using namespace std;


int main(){
    string ans = "";
    int row,column;
    cin>>row>>column;
    string code[100];
    bool flag;
    for(int i = 0;i < row;i++) cin>>code[i];
    for(int i = 0;i < row;i++) for(int j = 0;j < (int) code[i].length();j++){
        flag = true;
        for(int f = 0;f < row;f++){
            if(f == i) continue;
            if(code[f][j] == code[i][j]){
                flag = false;
                break;
            }
        }
        if(!flag) continue;
        for(int f = 0;f < (int) code[i].length();f++){
            if(f == j) continue;
            if(code[i][f] == code[i][j]){
                flag = false;
                break;
            }
        }
        if(!flag) continue;
        ans += code[i][j];
    }
    cout << ans << endl;
}

Rating 1344→1338(-6)

C,D,Eは見たが分からず。
Eは問題を解けそうだったが、Stack Overflowを起こしてしまい、断念。
他の人の回答を見たところDPっぽかったが、パッと見ただけなのでよく分からず。
要復習。

CodeForces Beta Round #75 Div2

懲りずに参加

A Chips
Passed System Test


n人が円形に並んでおり、m人のチップを順番に与えていく。
i番目の人間にi枚のチップを与え、最後まで与え終わったら初めに戻る。
与えるチップ数が足りない場合は、動作を中止し、余ったチップを回収。
回収できるチップの枚数を求める。



#include <iostream>
#include <vector>
#include <string>
#include <string.h>
#include <map>
#include <set>
#include <algorithm>
#include <time.h>
#include <cmath>
#include <queue>
using namespace std;


int main(){
    int n,m;
    cin >> n >> m;
    while(1){
        for(int i = 1;i <= n;i++){
            if(i <= m) m -= i;
            else{
                cout << m << endl;
                return 0;
            }
        }
    }
}



B Binary Number
Passed System Test


100001010のような2進数が与えられる。
与えられた数が偶数ならば、2で割り、奇数ならば、1を足す。
この操作を繰り返して、最終的に1にしたい。
何回の操作が必要になるか?




#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(){
    string arg;
    cin>>arg;
    int len = (int)arg.length()-1;
    int ans = len;
    bool flag = false;
    rep(i,len+1){
        if(arg[len-i] == '1' && !flag && len != i){
            flag = true;
            ans+=2;
        }
        if(arg[len-i] == '0' && flag) ans++;
    }
    cout << ans << endl;
}

C Newspaper Headline
Compilation Error

文字列が二つ(s1,s2)与えられる。
s1を幾つか繋げた後、繋げた文字列から幾つかの文字を消去し、s2を作りたい。
s2を作成するために、必要とするs1の最小個数を出力せよ。
なお、作成出来ない場合は-1を出力せよ。


abcd
dabc
の場合
abcd+abcd→abcdabcdとし
abcdabcdから初めのabc、最後のdを消去すれば
dabcとなるため、出力は2である。

1≦s1≦10^4 かつ 1≦s2≦10^6
であるため、ナイーヴな実装だと確実にTLEになる。

s1における文字の出現箇所をインデックスとして保持してやり、二部探索でやろうとするも、upper_boundではうまくいかず。
aaabbb
aaabbbのような時に、
upper_boundのため最初の文字が認識されず、出力が2となってしまう。
lower_bound + 1でやろうとするも、何故かバグる。
もうちょい修行してきます。

Rating 1338→1367(+29)

以前出来なかったことが少しずつ出来るようになってきた。
ただ、コンテストに出場するよりも、今までやってきた問題の復習をした方が良い気はする。

2011年6月7日火曜日

家計管理入門

自分が毎月いくらぐらい使っているのか?
いま自分が持っている資産はどの程度あるのか?
ビジネス(法人)においては言わずもがな、個人レベルに落としても、それらを知っておくことは非常に重要である。

と、いうわけで家計管理入門。

僕は今まで家計簿というものを付けようとして継続したためしがなく、大抵2~3日間の記録だけが記入された家計簿が机の中で埃をかぶっている状態だ。
しかしまぁ、そんな僕も流石にそろそろ資産を管理しておかないと不味いな、と思い立ち、エクセルで家計簿を作ってみることにした。
しかしこれが面倒くさい。

「そうだ、家計簿のシートスケルトンを持ってきて、それに記入すればいいんだ!」←体の良いサボリ

といことで、色々探ってみた結果。


http://fpdiary.blog23.fc2.com/blog-entry-136.html

これである。
試しに少し使ってみたが、ズボラの権化のような僕でも何とか続きそうだ。
おそらく、初めはこういう低いライン、つまり、細かい品目を気にせず、とりあえず書く、というところから始めて、少しずつ品目を足していくのが一番良いのだろう。


@nico_shindannin さんが物凄く良いことを仰っていたので、引用

「高すぎる目標をたてる」→「全く達成できず」→「惜しくないので自分の能力が計れない」→「また、高すぎる目標をたてる」ループに陥っている人・会社は本当に多い。そういう人はまずは簡単な目標を立て、簡単と思っている目標すら達成するのは実は難しいのを知るべき

2011年6月1日水曜日

今更ながらTopCoder SRM507 Div1参加日記

TopCoderのSRM507に参加してきました。

Easy
Passed System Test 182.37

サイコロがある。
6つ以上の要素を持った色の配列が与えられるので、隣接する面が同じ色にならないように塗り分けられればYES、無理ならばNOを出力せよ。
要素は重複して与えられることもある。

解答
違う色が6色与えられればYES、サイコロの性質を考えれば分かることだが、同じ色でも反対側に塗れば問題ないため、同じ色は2回までなら違う色としてカウントしても良い。

提出コード

#include <algorithm>
#include <iostream>
#include <map>
#include <numeric>
#include <set>
#include <sstream>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
#include <time.h>
using namespace std;

#define REP(i,s,e) for (int i = int(s); i != int(e); i++)
#define rep(i,e) REP(i,0,e)
#define foreach(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()
#define MIN 1<<31
#define MAX 1<<30

class CubeStickers {
public:
   string isPossible( vector <string> sticker ) {
   int n = (int)sticker.size();
   map<string,int> colors;
   map<string,int>::iterator iter;
   rep(i,n){
if( (iter = colors.find(sticker[i])) != colors.end()) iter->second = 2; else colors.insert(pair<string,int>(sticker[i], 1));
   }
   int ans = 0;
   for(iter = colors.begin();iter != colors.end();iter++) ans += iter->second;
   return (ans > 5)? "YES":"NO";

   }
};


Medium
Challenge Succeeded 0

Ns個の1*1*1立方体と、Nb個のL*L*L立方体がある。
これらをまとめて一つの大きい立方体の中に入れたい。
最小になるような立方体の体積を求めよ。

L*L*Lの立方体をひたすら縦に積み上げていく方法(一次元解法)と、ひたすら三次元に拡大していく方法(三次元解法)を試したのですが、あっけなくChallenge Succeded。

修正して提出したコード(りんごさんのコードの丸パクリ)


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

using namespace std;>

#define REP(i,s,e) for (int i = int(s); i != int(e); i++)
#define rep(i,e) REP(i,0,e)
#define foreach(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()
#define ll long long
#define INF 1<<30

class CubePacking {
public:
   int getMinimumVolume( int Ns, int Nb, int L ) {
   ll D=L,ss=Ns,bb=Nb,tmp,c,minimum=D*D*D*bb+ss,ans=INT_MAX,M=INT_MAX;
   for(ll a=L;a*a*a<=M;a++) for(ll b=L;a*b*b<=M;b++){
   tmp = (a/D) * (b/D);
   c=((bb+tmp-1)/tmp)*D;
   ll vol=a*b*c;
   ll in=a*b;
   if(minimum>vol) c+=((minimum-vol)+in-1)/in;
   ans=min(a*b*c,ans);
   }
   return (int)ans;
  }
};