<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>cpp / Drkcore</title><link>http://blog.kzfmix.com/cpp</link><description>Programming, Music, Snowboarding</description><language>ja</language><lastBuildDate>Tue, 12 Jan 2010 10:57:43 +0919</lastBuildDate><item><title>c++のキャストとか</title><link>http://blog.kzfmix.com/entry/1209128862</link><description>&lt;p&gt;openbabelがC++で書かれているので、今年はC++を覚えようと。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;int a = (int)('0'); // 48
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;これはpythonでいうord&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; ord("0")
48
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;で、最初よく分からなかったのでこれ。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(char)(5 + '0'); // 5
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;結局&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;int a = 5 + '0'; // 53
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;となっているからint + charみたいなのもよろしくやっといてくれるっちゅう理解でいいのかな。&lt;/p&gt;

&lt;p&gt;とりあえずクックブックでも買うべきか。&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/487311148X/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51JZSGMGRFL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;C++実践プログラミング&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
スティーブ オウアルライン &lt;br /&gt;
オライリージャパン / ￥ 6,090 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113032/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/41JMG5QHAGL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;C++クックブック&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
D. Ryan Stephens,Christopher Diggins,Jonathan Turkanis,Jeff Cogswell &lt;br /&gt;
オライリー・ジャパン / ￥ 4,515 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;
</description><pubDate>Tue, 12 Jan 2010 10:57:43 +0919</pubDate><category>Python</category><category>cpp</category></item><item><title>SRM162-DIV2-250</title><link>http://blog.kzfmix.com/entry/1211207073</link><description>&lt;p&gt;最小と最大の数を与えられた時にそのレンジの数の最小公倍数を求める。&lt;/p&gt;

&lt;p&gt;順繰りにかけていって、その際に最大公約数で割ってく。最大公約数はユークリッドの互除法で。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def lcm(first,last):
    l =1  
    for i in range(first,last):
        l = l * i / gcd(l,i)
    return l 

def gcd(a,b):
    if(b==0): return a
    return gcd(b, a % b)

print lcm(1,5)
print lcm(4,5)
print lcm(1,12)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;実行&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/usr/bin/python  /Users/kzfm/python/lcmr.py 
12
4
27720
&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Tue, 12 Jan 2010 10:55:25 +0919</pubDate><category>Python</category><category>cpp</category></item><item><title>c++のcout</title><link>http://blog.kzfmix.com/entry/1220563370</link><description>&lt;p&gt;ちょっと確認&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

using namespace std;

int main(){
  const char* a = "abcde";
  cout &amp;lt;&amp;lt; a &amp;lt;&amp;lt;endl;

  cout &amp;lt;&amp;lt; *a &amp;lt;&amp;lt;endl;
  cout &amp;lt;&amp;lt; *++a &amp;lt;&amp;lt;endl;
  cout &amp;lt;&amp;lt; *++(++a) &amp;lt;&amp;lt;endl;

}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;実行する。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ./test
abcde
a
b
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ふむ、なるほど。&lt;/p&gt;
</description><pubDate>Fri, 05 Sep 2008 06:23:03 +0919</pubDate><category>cpp</category></item><item><title>今日のtopcoder</title><link>http://blog.kzfmix.com/entry/1220532191</link><description>&lt;p&gt;今日のtopcoder&lt;/p&gt;

&lt;p&gt;pythonと同じ感覚で、ベキ乗を計算するのに&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; results += 2 ** i
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;とかやってたみたいで、コンパイル時に&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;invalid type argument of 'unary *'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;というエラーが出てきてたのだけど、型か?キャストか?なんてドはまりしたあげく時間を食いつぶして死亡。&lt;/p&gt;
</description><pubDate>Thu, 04 Sep 2008 21:44:35 +0919</pubDate><category>cpp</category><category>topcoder</category></item><item><title>c++ のc_strとconst</title><link>http://blog.kzfmix.com/entry/1220444344</link><description>&lt;p&gt;string型にc_strメンバ関数を適用するとcharのconst char 配列のアドレスが得られる&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;iostream&amp;gt;

using namespace std;

int ccount(const char* a){
  int r = 0;
  while(*a){
    ++r;
    ++a;
  }
  return r;
}

int main(){
  string  test_str = "test";
  int count = ccount(test_str.c_str());
  cout &amp;lt;&amp;lt; count &amp;lt;&amp;lt; endl;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;whlile(*a)と書くところはわかるんだけど、引数にconst charでないとだめな理由がわからん。const charとcharって違う型なのか？単にconstっていうキーワードがついてるだけなんだと思ってた。&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4839926050/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51ZNxQ57%2BbL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;ロベールのC++入門講座&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
ロベール &lt;br /&gt;
毎日コミュニケーションズ / ￥ 3,990 ()&lt;br /&gt;
通常24時間以内に発送&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;あと、typedefの使い方もなんとなくわかった。mapとか省略したくなる。&lt;/p&gt;
</description><pubDate>Wed, 03 Sep 2008 21:19:31 +0919</pubDate><category>cpp</category></item><item><title>c++でset (SRM-DIV2-250)</title><link>http://blog.kzfmix.com/entry/1220441310</link><description>&lt;p&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=2913&amp;amp;rd=5849"&gt;ユーザー登録する際にIDがかぶったら数字のナンバリングをする&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;setの使い方を覚えた。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class UserName {
public:
  string newMember(vector &amp;lt;string&amp;gt; existingNames, string newName) {
    int n=1;
    set &amp;lt;string&amp;gt; s;
    for(int i=0;i&amp;lt;existingNames.size();++i){
      s.insert(existingNames[i]);
    }

    if(s.count(newName) == 0) return newName; 

    while(1){
      stringstream ss;
      ss &amp;lt;&amp;lt; newName &amp;lt;&amp;lt; n;
      if(s.count(ss.str()) == 0) return ss.str();
      n++;
    }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;set便利&lt;/p&gt;
</description><pubDate>Wed, 03 Sep 2008 20:28:43 +0919</pubDate><category>cpp</category><category>topcoder</category></item><item><title>SRM414</title><link>http://blog.kzfmix.com/entry/1218929464</link><description>&lt;p&gt;一問も解けなかった。というか250点に時間をかけすぎたうえに途中であきらめたのがよくなかった。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=8786&amp;amp;rd=13505"&gt;RestaurantManager&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;席が埋まっているかどうかを、何番目のグループがどの席に座っているかという情報をmapで持たせようとしてたのが間違い。単にどの席がいつまで埋まっているかという時間の情報をベクタに突っ込んでおいて新規客の到着時刻と照らし合わせればよいだけだった。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class RestaurantManager {
public:
  int allocateTables(vector &amp;lt;int&amp;gt; tables, vector &amp;lt;int&amp;gt; groupSizes, vector &amp;lt;int&amp;gt; arrivals, vector &amp;lt;int&amp;gt; departures) {
    vector &amp;lt;int&amp;gt; occupied;
    int away = 0,j;
    sort(tables.begin(),tables.end());
    for(int i=0;i&amp;lt;tables.size();++i) occupied.push_back(0);

    for(int i = 0;i&amp;lt;groupSizes.size();++i){
      for(j = 0;j&amp;lt;tables.size();++j){
        if(groupSizes[i] &amp;lt;= tables[j] &amp;amp;&amp;amp; occupied[j] &amp;lt;= arrivals[i]){
          occupied[j] = departures[i];
          break;
        }
      }
      if(j == tables.size()) away += groupSizes[i];
   }
   return away;
  }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=9895&amp;amp;rd=13505"&gt;Embassy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;あとで&lt;/p&gt;
</description><pubDate>Sun, 17 Aug 2008 09:04:18 +0919</pubDate><category>cpp</category><category>topcoder</category></item><item><title>SRM200-DIV2-1000</title><link>http://blog.kzfmix.com/entry/1218629091</link><description>&lt;p&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=2415&amp;amp;rd=5075"&gt;WindowManager&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class WindowManager {
public:
  vector &amp;lt;string&amp;gt; screen(int height, int width, vector &amp;lt;string&amp;gt; windows) {
    vector &amp;lt;string&amp;gt; result;
    stringstream ss;
    int lx,ly,rx,ry;
    char c;
    result.clear();
    string s;
    s.clear();
    s = "";
    //    cout &amp;lt;&amp;lt; width &amp;lt;&amp;lt; "," &amp;lt;&amp;lt; height &amp;lt;&amp;lt; endl;
    for(int a=0;a&amp;lt;width;++a) s += " ";
    for(int b=0;b&amp;lt;height;++b) result.push_back(s);

    for(int i = 0;i&amp;lt;windows.size();++i) {
      ss.str(windows[i]);
      ss &amp;gt;&amp;gt; ly &amp;gt;&amp;gt; lx &amp;gt;&amp;gt; ry &amp;gt;&amp;gt; rx &amp;gt;&amp;gt; c;
      rx += lx -1;
      ry += ly -1;

      for(int y=0;y&amp;lt;height;++y) {
    for(int x=0;x&amp;lt;width;++x) {
      if((x==lx &amp;amp;&amp;amp; y==ly) ||(x==lx &amp;amp;&amp;amp; y==ry) ||(x==rx &amp;amp;&amp;amp; y==ly) ||(x==rx &amp;amp;&amp;amp; y==ry)) {
        result[y][x] = '+';
      }
      else if(((x == lx)||(x == rx)) &amp;amp;&amp;amp; (y &amp;gt; ly) &amp;amp;&amp;amp; (y &amp;lt; ry)) {
        result[y][x] = '|';
      }
      else if(((y == ly)||(y == ry)) &amp;amp;&amp;amp; (x &amp;gt;lx) &amp;amp;&amp;amp; (x &amp;lt; rx)) {
        result[y][x] = '-';
      }
      else if((x &amp;gt;lx) &amp;amp;&amp;amp; (x &amp;lt; rx) &amp;amp;&amp;amp; (y &amp;gt; ly) &amp;amp;&amp;amp; (y &amp;lt; ry)){
        result[y][x] = c;
      }
        }
      }
      ss.str("");
      ss.clear();
    }
    return result;
  } 
};
&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Wed, 13 Aug 2008 21:05:10 +0919</pubDate><category>cpp</category><category>topcoder</category></item><item><title>SRM199-DIV2-500</title><link>http://blog.kzfmix.com/entry/1218547344</link><description>&lt;p&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=2889"&gt;三角形の数を数える&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;パズルみたいな問題。上向きと下向きに分けて数えていけばOK&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class TriangleCount {
public:
  int count(int N) {
    int result = 0;
    for(int i = 1;i&amp;lt;=N;++i){
      for (int j = i;j&amp;lt;=N;j++){
    result += j-i+1;
    int down = j - i + 1 -i;
    if ((down) &amp;gt; 0) result += down; 
      }
    }
    return result;
  }
};
&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Tue, 12 Aug 2008 22:22:43 +0919</pubDate><category>cpp</category><category>topcoder</category></item><item><title>SRM198-DIV2-500</title><link>http://blog.kzfmix.com/entry/1218455615</link><description>&lt;p&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=2891&amp;amp;rd=5073"&gt;赤と黒のチェッカーボードの赤い部分を数える&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;チェッカーボードの作り方がおかしいのに気づかず、テストがこける理由が分からなかった。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class RedSquare {
public:
  int countTheEmptyReds(int maxRank, int maxFile, vector &amp;lt;int&amp;gt; rank, vector &amp;lt;int&amp;gt; file) {
    int board[50][50];
    int result = 0;
    memset(board,0,sizeof(board));
    bool black;
    for(int   i=0; i&amp;lt;maxRank;++i) {
      if     (i == 0) {black  = true;}
      else if(board[i-1][maxFile-1]){black = true;}
      else {black = false;}
      for(int j=maxFile-1; j&amp;gt;=0; --j) {
    if(black){
      black = false;    
        }
        else{
          board[i][j] = 1;
          black = true;
        }
      }
    }

    for(int k=0;k&amp;lt;rank.size();++k) {
      int m = rank[k]-1;
      int n = file[k]-1;
      board[m][n] = 0;
    }

    for(int x = 0;x&amp;lt;maxRank;++x)
      for(int y = 0;y&amp;lt;maxFile;++y) 
result += board[x][y];

    return result;  
}
};
&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Mon, 11 Aug 2008 20:53:47 +0919</pubDate><category>cpp</category><category>topcoder</category></item></channel></rss>