<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>topcoder / Drkcore</title><link>http://blog.kzfmix.com/topcoder</link><description>Programming, Music, Snowboarding</description><language>ja</language><lastBuildDate>Tue, 13 Apr 2010 19:51:40 +0919</lastBuildDate><item><title>SRM435DIV2_250</title><link>http://blog.kzfmix.com/entry/1271155867</link><description>&lt;p&gt;余計な変数多いな。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public class SkiFriction {

    public int bestPosition(String sF, String pF) {
        int sFl = sF.length();
        int pFl = pF.length();
        if(sFl &amp;gt;= pFl) return 0;
        int result = 0;
        for(int i=0;i&amp;lt;pFl-sFl;i++) {
            int lmax = 0;
            for(int j=0;j&amp;lt;sFl;j++){
                int k = sF.charAt(j) - '0'+ pF.charAt(i+j) - '0';
                if(k&amp;gt;lmax) lmax = k;
            }
            result += lmax;
        }
        return result;
    }    
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;数字の比較は&lt;a href="http://www.topcoder.com/stat?c=problem_solution&amp;amp;cr=22731949&amp;amp;rd=13697&amp;amp;pm=10294"&gt;Math.max&lt;/a&gt;使えばいいのか&lt;/p&gt;
</description><pubDate>Tue, 13 Apr 2010 19:51:40 +0919</pubDate><category>java</category><category>topcoder</category></item><item><title>SRM460DIV2_250</title><link>http://blog.kzfmix.com/entry/1270890325</link><description>&lt;p&gt;java勉強中。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import java.util.ArrayList;
import java.util.List;

public class TheQuestionsAndAnswersDivTwo {

    public int find(String[] q) {
        List qlist = new ArrayList();
        int ans = 0;
        for (int i = 0; i &amp;lt; q.length; ++i)
            if (!qlist.contains(q[i]))
                qlist.add(q[i]);

        ans = (int) Math.pow(2, qlist.size());
        return ans;
    }

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

&lt;p&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_solution&amp;amp;cr=22826981&amp;amp;rd=14146&amp;amp;pm=10769"&gt;Set使えばいい&lt;/a&gt;のね。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.stackasterisk.jp/tech/java/collection01_01.jsp"&gt;コレクションフレームワーク&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.javaroad.jp/java_collection1.htm"&gt;javaの道&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Sat, 10 Apr 2010 18:09:00 +0919</pubDate><category>java</category><category>topcoder</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++で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><item><title>SRM195-DIV2-500&amp;1100</title><link>http://blog.kzfmix.com/entry/1218199684</link><description>&lt;p&gt;そろそろ1000点問題などもやりはじめる。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=2235&amp;amp;rd=5070"&gt;FanFailure&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class FanFailure {
public:
  vector &amp;lt;int&amp;gt; getRange(vector &amp;lt;int&amp;gt; capacities, int minCooling) {
    int mfs=capacities.size();
    int mfc=capacities.size();
    vector &amp;lt;int&amp;gt; result;
    sort(capacities.rbegin(),capacities.rend());
    int rest = minCooling;
    for(int i = 0;i&amp;lt;capacities.size();++i) {
      rest -= capacities[i];
      mfs--;
      if (rest &amp;lt; 0) break;
    }

    sort(capacities.begin(),capacities.end());
    rest = minCooling;
    for(int i = 0;i&amp;lt;capacities.size();++i) {
      rest -= capacities[i];
      mfc--;
      if (rest &amp;lt; 0) break;
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;特にこれといってはまるところはなし。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=2442&amp;amp;rd=5070"&gt;ChangePurse&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class ChangePurse {
  int find_pos(vector &amp;lt;int&amp;gt; cointypes, int val){
    for(int i =0; i&amp;lt;cointypes.size();++i){
      if(val == cointypes[i]) return i;
    }
  }
public:
  vector &amp;lt;int&amp;gt; optimalCoins(vector &amp;lt;int&amp;gt; coinTypes, int value) {
    vector &amp;lt;int&amp;gt; cs = coinTypes;
    vector &amp;lt;int&amp;gt; mapped;
    vector &amp;lt;int&amp;gt; coins;
    vector &amp;lt;int&amp;gt; results;
    int num; 
    for(int i=0;i&amp;lt;coinTypes.size();++i) results.push_back(0);
    sort(cs.rbegin(),cs.rend());
    for(int k=0;k&amp;lt;cs.size();++k) mapped.push_back(find_pos(coinTypes,cs[k]));

    for(int j =0;j&amp;lt;cs.size();++j){
      if((value+1)%cs[j]==0){
    coins.push_back(value / cs[j]);
    value = cs[j]-1;
      }
      else {
    coins.push_back(0);
      }
    }
    coins.push_back(value);
    for(int z = 0;z&amp;lt;cs.size();++z) results[mapped[z]] = coins[z];
    return results;
  }

    result.push_back(mfs);
    result.push_back(mfc);
    return result;
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ベクタをソートする際にソート前のインデックスを覚えておきたい場合どうやるのがいいのかがわからん。&lt;/p&gt;
</description><pubDate>Fri, 08 Aug 2008 21:48:28 +0919</pubDate><category>cpp</category><category>topcoder</category></item><item><title>SRM413-DIV2-1000</title><link>http://blog.kzfmix.com/entry/1218114749</link><description>&lt;p&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=9837&amp;amp;rd=13504"&gt;InfiniteSequence&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;普通にメモ化するだけでいいのかなー、落とし穴でもあるんじゃなかろうか？なんて思ってたけどそんなものはなかった。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class InfiniteSequence {
  map&amp;lt;long long, long long&amp;gt; cache;
  long long acalc (long long n, int p, int q) {
    if (n == 0) return 1;
    if (cache.find(n) == cache.end()) {
      cache[n] = acalc(n/p, p, q) + acalc(n/q, p, q);
    }
    return cache[n];
  }
public:
  long long calc(long long n, int p, int q) {
    cache.clear();
    return acalc(n,p,q);
}
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;最初手元のテストが通らなくて悩んでいたらキャッシュをクリアーしてなかった。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cache.clear()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;覚えた。&lt;/p&gt;
</description><pubDate>Thu, 07 Aug 2008 22:12:51 +0919</pubDate><category>cpp</category><category>topcoder</category></item></channel></rss>