Hatena::Grouptopcoder

niha SRM

 | 

2010-04-21

書くだけ 20:47

SRM 467 DIV2 250

書くだけ。

なんだけれど、最初 (n + 1) * n / 2 をちょっと調子のって -~n * (n / 2) とかかいてて最初通らず。

かっこ悪い…

デザインをかえた 16:13

スーパー pre 記法が死んでたのでデザインをかえた

いきかえった…

pre { line-height: 1; } で見やすくなた!

時間かかりすぎでげす 16:00

SRM 468 DIV2 500

問題文長すぎで全然解き始められなかったうえに

  • find_if と find の書き間違え
  • "ace" は "112" でなく "223" な罠
  • map の iterate が pair なこと

ひっかかりそうなところは全部引っかかったぜ…

あと bind2nd と bind1st も間違えた。最初 string -> string -> bool だったのを途中で書き直したから…

bool include(string str, char ch){
  return find(ALL(str), ch) != str.end();
}

bool isNumber(char ch){
  return '0' <= ch && ch <= '9';
}

bool isNotNumber(char ch){
  return !('0' <= ch && ch <= '9');
}

class T9 {
public:
  string message(vector <string> part, vector <string> dict, vector <string> keystr) {
    map<string, vector<string> > dictOfNums;
    FOREACH(i, dict) {
      string tmp;
      FOREACH(j, *i) {
        tmp.push_back('1' + distance(part.begin(), find_if(ALL(part), bind2nd(ptr_fun(include), *j))));
      }
      dictOfNums[tmp].push_back(*i);
    }

    FOREACH(i, dictOfNums) {
      sort(i->second.begin(), i->second.end());
    }

    string str = accumulate(ALL(keystr), std::string(""));
    string::iterator it;
    while ((it = find(ALL(str), '*')) != str.end()) {
      str.replace(it, it + 1, 5, '#');
    }

    while ((it = find(ALL(str), '0')) != str.end()) {
      str.replace(it, it + 1, " ");
    }

    string::iterator h, t, e;
    while ((h = find_if(ALL(str), isNumber)) != str.end()) {
      t = find_if(h, str.end(), isNotNumber);
      e = find(t, str.end(), ' ');
      string key(h, t);
      string sharp(t, e);
      str.replace(h, e, dictOfNums[key][sharp.size()]);
    }

    return str;
  }
};

書きながら思ったけれどこれ多分テーブルとか作らなくても時間余裕なんだよなあ。でもごちゃっと実装するの苦手だからなあ…

昨日は 14:14

どうかしてた

bool comp(pair<int, int> l, pair<int, int> r){
  return l.second > r.second;
}

bool pred(pair<int, int> v){
  return v.second < 1;
}

class RoadOrFlightEasy {
public:
  int minTime(int N, vector <int> roadTime, vector <int> flightTime, int K) {
    vector< pair</*index*/int, int> > vs;
    for (int i = 0; i < N; i++) {
      vs.push_back(make_pair(i, roadTime[i] - flightTime[i]));
    }

    partial_sort(ALL(vs), vs.begin() + K, comp);
    vs.erase(vs.begin() + K, vs.end());
    vs.erase(remove_if(ALL(vs), pred), vs.end());

    FOREACH(i, vs) {
      roadTime[i->first] = flightTime[i->first];
    }

    return accumulate(ALL(roadTime), 0);
  }
};

ゲスト



トラックバック - http://topcoder.g.hatena.ne.jp/niha/20100421
 |