Hatena::Grouptopcoder

naoya_t@topcoder RSSフィード

2008-12-24SRM431

SRM431 祝☆YellowCoder

SRM431 祝☆YellowCoder - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM431 祝☆YellowCoder - naoya_t@topcoder SRM431 祝☆YellowCoder - naoya_t@topcoder のブックマークコメント

12.23+.2008 (今年最終)

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

250点問題: LaserShooting

数分でできた。(自己最速?)

システムテストも通って235.94点。

#define sz(a)  int((a).size())
#define pb  push_back
#define all(c)  (c).begin(),(c).end()
#define tr(c,i)  for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); i++)

class LaserShooting {
public:
  double numberOfHits(vector <int> x, vector <int> y1, vector <int> y2) {
    int n=x.size();
    double rate=0;
    for(int i=0;i<n;i++){
      double r1=atan2((double)y1[i],(double)x[i]),
        r2=atan2((double)y2[i],(double)x[i]);
      if (r1>r2) { double tmp=r1;r1=r2;r2=tmp;}
      rate += (r2-r1)/3.141592653589793238462643383279;
    }
    return rate;
  }
};

円周率手打ちです。acos(-1)とかM_PIとか使った方が打鍵数少なくて良いのですが思いつかなくて。すみませんすみません。

500点問題: MegaCoolNumbers

たっぷり(1時間超)時間が使えたけど解けなかった。

あとで続きを考えよう。

部屋で1人もsubmitしていなかった。チャレンジすらできないとは。

[追記]Div1全体でも19人しか通ってない!

1000点問題

開いてない

もしかしたら1000点問題に挑戦してもよかったのかも・・・解けそうかどうか開いてみるだけでも・・・

235.94点で119/526位。

レーティング:1456→1577 祝☆Yellow Coder昇格

http://gyazo.com/29e256dea7aafcd74cc4c46955a6f4e0.png

これは素敵なクリスマスプレゼント(≒自分へのご褒美)。

次回SRM(来年)ではとりあえず黄色防衛したいので、確実に2問解ける実力(特にスピード)を身につけないと。

来年はRedを目指す!!

SRM410 Div1 Easy: AddElectricalWires

| 18:07 | SRM410 Div1 Easy: [http://www.topcoder.com/stat?c=problem_statement&pm=8817&rd=12182:title=AddElectricalWires] - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM410 Div1 Easy: [http://www.topcoder.com/stat?c=problem_statement&pm=8817&rd=12182:title=AddElectricalWires] - naoya_t@topcoder SRM410 Div1 Easy: [http://www.topcoder.com/stat?c=problem_statement&pm=8817&rd=12182:title=AddElectricalWires] - naoya_t@topcoder のブックマークコメント

これ250点問題だけどちょっと難しい。サンプルケースが通った程度では安心できない。通過率も53.71%でMediumより低い。

  • gridに繋がっているノードをまとめる
    • いちばん多く繋がっているgridはどれか
  • gridに繋がっていないノードは全て、いちばん多く繋がっているgridに繋げる
  • 各gridについて、同じgridに繋がるノードは全て繋ぐ
  • 最初からあるコネクションの数を引く
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

#define tr(c,i)  for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); i++)
#define rep(var,n)  for(int var=0;var<(n);var++)

class AddElectricalWires {
  vector<vector<bool> > w;
  vector<int> gC;
  int nw, ngc;

  void turn(int orig,int dest) {
    rep(i,nw) if (gC[i]==orig) gC[i]=dest;
  }

public:
  int all_connections(int n) { return (n>=2) ? n*(n-1)/2 : 0; }
    
  int maxNewWires(vector<string> wires, vector<int> gridConnections) {
    nw = wires.size(); // 1-50
    ngc = gC.size(); // 1-50

    gC.resize(nw); rep(i,nw) gC[i]=-i-1;
    tr(gridConnections,it) gC[*it]=*it;

    int conn = 0;
    w.resize(nw); tr(w,it) it->resize(nw);
    rep(i,nw) rep(j,nw) {
      w[i][j] = (wires[i][j]=='1');
      if (i<j && w[i][j]) {
        conn++;
        turn(min(gC[i],gC[j]), max(gC[i],gC[j]));
      }
    }
    rep(i,nw) if (gC[i]<0) gC[i] = -1;

    vector<int> count(nw+1,0);
    rep(i,nw) count[1+gC[i]]++;

    int maxc = 0, maxc_at = -1;
    for (int i=1;i<=nw;i++)
      if (count[i] > maxc) {
        maxc = count[i]; maxc_at = i;
      }
    if (maxc_at < 0) {
      return all_connections(nw) - conn;
    } else {
      count[maxc_at] += count[0];
      int ans = 0;
      for (int i=1;i<=nw;i++) ans += all_connections(count[i]);
      return ans - conn;
    }
  }
};

SRM409 Div1 Easy: OrderedSuperString

| 18:07 | SRM409 Div1 Easy: OrderedSuperString - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM409 Div1 Easy: OrderedSuperString - naoya_t@topcoder SRM409 Div1 Easy: OrderedSuperString - naoya_t@topcoder のブックマークコメント

酩酊状態で解いたら1時間かかった。バグっててシステムテスト1つ通らず。(→直った)

class OrderedSuperString {
public:
  int getLength(vector<string> words) {
    int n=words.size();

    string w0=words[0];
    int l0=w0.length();
    if(n==1) return l0;
    int a0=0;

    for (int i=1;i<n;i++) {
      string wi=words[i];
      int li=wi.length();
      if (l0>=li) {
        for(int a=a0;a<=l0-li;a++) {
          if(w0.substr(a,li)==wi) {a0=a; goto next;}
        }
      }
      for(int w=min(l0,li-1);w>0;w--){
        if(l0-w<a0)continue;
        if (w0.substr(l0-w,w)==wi.substr(0,w)) {w0+=wi.substr(w,li-w);a0=l0-w;l0+=li-w;goto next;}
      }
      a0 = l0; w0 += wi; l0 += li;
    next:
      ; 
    }
    return l0;
  }
};