Hatena::Grouptopcoder

naoya_t@topcoder RSSフィード

2009-01-07

SRM378 Div1 Easy: TrueStatements

| 23:11 | SRM378 Div1 Easy: TrueStatements - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM378 Div1 Easy: TrueStatements - naoya_t@topcoder SRM378 Div1 Easy: TrueStatements - naoya_t@topcoder のブックマークコメント

思いついたのをまっすぐ書いた。3'45''ぐらい。

Passed System Test / 244.98点。

続きを読む

SRM379 Div1 Easy: SellingProducts

| 22:39 | SRM379 Div1 Easy: SellingProducts - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM379 Div1 Easy: SellingProducts - naoya_t@topcoder SRM379 Div1 Easy: SellingProducts - naoya_t@topcoder のブックマークコメント

サンプルケースが親切

続きを読む

SRM432 Div1 Medium: GroupedWord

| 21:21 | SRM432 Div1 Medium: GroupedWord - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM432 Div1 Medium: GroupedWord - naoya_t@topcoder SRM432 Div1 Medium: GroupedWord - naoya_t@topcoder のブックマークコメント

昨日のSRMの500点問題を解いてみる。

続きを読む

トラックバック - https://topcoder-g-hatena-ne-jp.jag-icpc.org/n4_t/20090107

2009-01-06

SRM432

23:04 | SRM432 - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM432 - naoya_t@topcoder SRM432 - naoya_t@topcoder のブックマークコメント

01.06.2009 (今年最初)

続きを読む

DIVlevel問題名競技中後でSystem Test通過率備考
1 250 LampsGrid 110.63点
1 500 GroupedWord 間に合わず
1 1000

SRM380 Div1 Easy: LameKnight

| 20:58 | SRM380 Div1 Easy: LameKnight - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM380 Div1 Easy: LameKnight - naoya_t@topcoder SRM380 Div1 Easy: LameKnight - naoya_t@topcoder のブックマークコメント

SRM432前の準備運動(その2) SRM開始まであと13分・・・ Test Caseは全部通ったのでsubmitしたけどSystem Test落ち

続きを読む

2008-12-30

SRM382 Div1 Easy: CollectingRiders

| 03:01 | SRM382 Div1 Easy: CollectingRiders - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM382 Div1 Easy: CollectingRiders - naoya_t@topcoder SRM382 Div1 Easy: CollectingRiders - naoya_t@topcoder のブックマークコメント

問題読み違えてた。これ本番に1時間15分で解けるだろうか。

続きを読む

トラックバック - https://topcoder-g-hatena-ne-jp.jag-icpc.org/n4_t/20081230

2008-12-29

SRM383 Div1 Easy: Planks

| 23:55 | SRM383 Div1 Easy: Planks - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM383 Div1 Easy: Planks - naoya_t@topcoder SRM383 Div1 Easy: Planks - naoya_t@topcoder のブックマークコメント

Plankとは厚い板のこと。

続きを読む

SRM384 Div1 Easy: Library

| 23:39 | SRM384 Div1 Easy: Library - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM384 Div1 Easy: Library - naoya_t@topcoder SRM384 Div1 Easy: Library - naoya_t@topcoder のブックマークコメント

簡単。split()は自前

続きを読む

SRM385 Div1 Easy: UnderscoreJustification

| 23:10 | SRM385 Div1 Easy: UnderscoreJustification - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM385 Div1 Easy: UnderscoreJustification - naoya_t@topcoder SRM385 Div1 Easy: UnderscoreJustification - naoya_t@topcoder のブックマークコメント

これは速解き系なんだろうな。

最近、慣れてきたのかコードが汚くなってきた。(スペースの数が減ったりとか)

続きを読む

SRM386 Div1 Easy: CandidateKeys

| 17:52 | SRM386 Div1 Easy: CandidateKeys - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM386 Div1 Easy: CandidateKeys - naoya_t@topcoder SRM386 Div1 Easy: CandidateKeys - naoya_t@topcoder のブックマークコメント

(statistics)

問題の意味がなかなか掴めなくて悩む。

サンプルのTest Caseは通るけどシステムテストが通らない←いまここ

後でやり直そう。

続きを読む

トラックバック - https://topcoder-g-hatena-ne-jp.jag-icpc.org/n4_t/20081229

2008-12-26

SRM387 Div1 Easy (300points): MarblesRegroupingEasy

| 19:55 | SRM387 Div1 Easy (300points): MarblesRegroupingEasy - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM387 Div1 Easy (300points): MarblesRegroupingEasy - naoya_t@topcoder SRM387 Div1 Easy (300points): MarblesRegroupingEasy - naoya_t@topcoder のブックマークコメント

どう解いたらよいのかぱっとは思いつかない。

全てのmarblejoker boxに放り込む(move回数はN-1)のが手数としては最大になるのかな、というところまで。あとで考えよう。

SRM391 Div1 Easy: IsomorphicWords

| 09:42 | SRM391 Div1 Easy: IsomorphicWords - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM391 Div1 Easy: IsomorphicWords - naoya_t@topcoder SRM391 Div1 Easy: IsomorphicWords - naoya_t@topcoder のブックマークコメント

問題を読み違えていて問題文のTest Caseすら通らず焦る。

続きを読む

SRM392 Div1 Easy: TwoStringMasks

| 08:46 | SRM392 Div1 Easy: TwoStringMasks - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM392 Div1 Easy: TwoStringMasks - naoya_t@topcoder SRM392 Div1 Easy: TwoStringMasks - naoya_t@topcoder のブックマークコメント

文字列操作。split()は自前

続きを読む

split()

| 08:51 | split() - naoya_t@topcoder を含むブックマーク はてなブックマーク - split() - naoya_t@topcoder split() - naoya_t@topcoder のブックマークコメント

私家版split()関数。

まずはデリミタがintのもの。

省略時には空白をデリミタとして認識する。

#include <string>
#include <vector>
using namespace std;

vector<string> split(string str, int delim=' ')
{
  vector<string> result;

  const char *s = str.c_str();
  if (delim == ' ') {
    for (const char *p=s; *p; p++) {
      if (*p == delim)
        s++;
      else
        break;
    }
    if (!*s) return result;

    for (const char *p=s; *p; p++) {
      if (*p == delim) {
        if (s < p) {
          string a(s,p-s);
          result.push_back(a);
        }
        s = p + 1;
      }
    }
    if (*s) result.push_back(s);
  } else {
    for (const char *p=s; *p; p++) {
      if (*p == delim) {
        string a(s,p-s);
        result.push_back(a);
        s = p + 1;
        if (*s == '\0') result.push_back("");
      }
    }
    if (*s) result.push_back(s);
  }

  return result;
}

次は文字列(string)をデリミタに取るもの。

#include <string>
#include <vector>
using namespace std;

vector<string> split(string str, string delim)
{
  vector<string> result;

  if (str.length() == 0) return result;

  if (delim.length() == 0) {
    int len = str.length();
    result.resize(len);
    for (int i=0; i<len; i++) result[i] = str.substr(i,1);
    return result;
  }

  int since = 0, at;
  while ((at = str.find(delim, since)) != string::npos) {
    result.push_back(str.substr(since, at-since));
    since = at + delim.length();
  }
  result.push_back(str.substr(since));

  return result;
}

自由に使っていいけど無保証。ご利用は計画的に。

おまけ

googletestもつけとくよ。

#include <gtest/gtest.h>

// テストケースを単体の関数として実装する
TEST(SplitTest, Split1)
{
  vector<string> result;

  result = split("", "<>");
  EXPECT_EQ( 1, result.size() );
  
  // "a","<>" => ["a"]
  result = split("a", "<>");
  EXPECT_EQ( 1, result.size() );
  EXPECT_EQ( "a", result[0] );
  
  // "a<>b<>c","<>" => ["a","b","c"]
  result = split("a<>b<>c", "<>");
  EXPECT_EQ( 3, result.size() );
  EXPECT_EQ( "a", result[0] );
  EXPECT_EQ( "b", result[1] );
  EXPECT_EQ( "c", result[2] );
  
  // "a<>b<>c<>","<>" => ["a","b","c",""]
  result = split("a<>b<>c<>", "<>");
  EXPECT_EQ( 4, result.size() );
  EXPECT_EQ( "a", result[0] );
  EXPECT_EQ( "b", result[1] );
  EXPECT_EQ( "c", result[2] );
  EXPECT_EQ( "" , result[3] );
  
  // "<>a<>b<>c","<>" => ["","a","b","c"]
  result = split("<>a<>b<>c", "<>");
  EXPECT_EQ( 4, result.size() );
  EXPECT_EQ( "" , result[0] );
  EXPECT_EQ( "a", result[1] );
  EXPECT_EQ( "b", result[2] );
  EXPECT_EQ( "c", result[3] );
  
  // "<>a<>","<>" => ["","a",""]
  result = split("<>a<>", "<>");
  EXPECT_EQ( 3, result.size() );
  EXPECT_EQ( "" , result[0] );
  EXPECT_EQ( "a", result[1] );
  EXPECT_EQ( "" , result[2] );
  
  // "a<><>b","<>" => ["a","","b"]
  result = split("a<><>b", "<>");
  EXPECT_EQ( 3, result.size() );
  EXPECT_EQ( "a", result[0] );
  EXPECT_EQ( "" , result[1] );
  EXPECT_EQ( "b", result[2] );
  
  // "<>","<>" => ["",""]
  result = split("<>", "<>");
  EXPECT_EQ( 2, result.size() );
  EXPECT_EQ( "", result[0] );
  EXPECT_EQ( "", result[1] );
  //
  result = split("", "");
  EXPECT_EQ( 0, result.size() );
  
  // 特殊用法 "abc".split('')
  result = split("abc", "");
  EXPECT_EQ( 3, result.size() );
  EXPECT_EQ( "a", result[0] );
  EXPECT_EQ( "b", result[1] );
  EXPECT_EQ( "c", result[2] );
  // EXPECT_TRUE_EQUAL( 2, 2 );
}

TEST(SplitTest, Split2)
{
  // cout << "test_split()" << endl;
  // dump_vs(result);
  vector<string> result;

  // "" => []
  result = split("");
  EXPECT_EQ( 0, result.size() );
  // "a" => ["a"]
  result = split("a");
  EXPECT_EQ( 1, result.size() );
  EXPECT_EQ( "a", result[0] );
  // "a b c" => ["a","b","c"]
  result = split("a b c");
  EXPECT_EQ( 3, result.size() );
  EXPECT_EQ( "a", result[0] );
  EXPECT_EQ( "b", result[1] );
  EXPECT_EQ( "c", result[2] );
  // "a " => ["a"]
  result = split("a ");
  EXPECT_EQ( 1, result.size() );
  EXPECT_EQ( "a", result[0] );
  // " a" => ["a"]
  result = split(" a");
  EXPECT_EQ( 1, result.size() );
  EXPECT_EQ( "a", result[0] );
  // " a " => ["a"]
  result = split(" a ");
  EXPECT_EQ( 1, result.size() );
  EXPECT_EQ( "a", result[0] );
  // "a b" => ["a","b"]
  result = split("a b");
  EXPECT_EQ( 2, result.size() );
  EXPECT_EQ( "a", result[0] );
  EXPECT_EQ( "b", result[1] );
  // "a  b" => ["a","b"]
  result = split("a  b");
  EXPECT_EQ( 2, result.size() );
  EXPECT_EQ( "a", result[0] );
  EXPECT_EQ( "b", result[1] );
  
  // "a b c",'b' => ["a "," c"]
  result = split("a b c",'b');
  EXPECT_EQ( 2, result.size() );
  EXPECT_EQ( "a ", result[0] );
  EXPECT_EQ( " c", result[1] );
  
  // "a,b",',' => ["a","b"]
  result = split("a,b", ',');
  EXPECT_EQ( 2, result.size() );
  EXPECT_EQ( "a", result[0] );
  EXPECT_EQ( "b", result[1] );
  // "a,,b",',' => ["a","","b"]
  result = split("a,,b", ',');
  EXPECT_EQ( 3, result.size() );
  EXPECT_EQ( "a", result[0] );
  EXPECT_EQ( "" , result[1] );
  EXPECT_EQ( "b", result[2] );
  // ",a",',' => ["","a"]
  result = split(",a", ',');
  EXPECT_EQ( 2, result.size() );
  EXPECT_EQ( "" , result[0] );
  EXPECT_EQ( "a", result[1] );
  // "a,",',' => ["a",""]
  result = split("a,", ',');
  EXPECT_EQ( 2, result.size() );
  EXPECT_EQ( "a", result[0] );
  EXPECT_EQ( "" , result[1] );
  // ",a,",',' => ["","a",""]
  result = split(",a,", ',');
  EXPECT_EQ( 3, result.size() );
  EXPECT_EQ( "" , result[0] );
  EXPECT_EQ( "a", result[1] );
  EXPECT_EQ( "" , result[2] );
}

int main(int argc, char** argv)
{
  testing::InitGoogleTest(&argc, argv);

  return RUN_ALL_TESTS();
}

SRM393 Div1 Easy: InstantRunoffVoting

| 06:39 | SRM393 Div1 Easy: InstantRunoffVoting - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM393 Div1 Easy: InstantRunoffVoting - naoya_t@topcoder SRM393 Div1 Easy: InstantRunoffVoting - naoya_t@topcoder のブックマークコメント

問題文のルールを素直にコーディングしたら解ける問題。のはずがちょっと手間取り。

続きを読む

SRM395 Div1 Easy: StreetWalking

| 05:19 | SRM395 Div1 Easy: StreetWalking - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM395 Div1 Easy: StreetWalking - naoya_t@topcoder SRM395 Div1 Easy: StreetWalking - naoya_t@topcoder のブックマークコメント

これは速解き問題。Test Caseが親切。(斜め/\に進んだほうが速いケースとか)

class StreetWalking {
public:
  long long minTime(int X, int Y, int walkTime, int sneakTime) {
    if(X>Y)swap(X,Y);
    long long a=Y-X, b=X, h=a/2, m=a%2;
    long long t = min(b*2*walkTime, b*sneakTime) 
      + min(a*walkTime, h*2*sneakTime+m*walkTime);
    return t;
  }
};

SRM396 Div1 Easy: DNAString

| 04:46 | SRM396 Div1 Easy: DNAString - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM396 Div1 Easy: DNAString - naoya_t@topcoder SRM396 Div1 Easy: DNAString - naoya_t@topcoder のブックマークコメント

よくわからないままコーディングしてたらTest Case全て通ったので投稿。システムテストも1発。12分前後。

続きを読む

SRM398 Div1 Easy: CountExpressions

| 03:20 | SRM398 Div1 Easy: CountExpressions - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM398 Div1 Easy: CountExpressions - naoya_t@topcoder SRM398 Div1 Easy: CountExpressions - naoya_t@topcoder のブックマークコメント

夜中ですが。目がさめたので練習でもするかと思い

続きを読む

トラックバック - https://topcoder-g-hatena-ne-jp.jag-icpc.org/n4_t/20081226