Testing Round #2

A

問題

単位がcmで長さが与えられるのでfeetとinchに直せ。
3cm = 1inch, 1feet=12inch, inchは近い整数に丸められる。

解法

やるだけ。n=35がやばいので自分含め大量Hackされていた。

ソース

int main() {
  int n;
  cin >> n;
  int feet =  n / 36;
  int inch = ((n%36)+1)/3;
  if (inch == 12) {
    feet++;
    inch = 0;
  }
  cout << feet << " " << inch << endl;
}

B

問題

XMLっぽい入力が与えられるのでインデントして表示せよ。

解法

<*>が来たらネスト数を1増やし、が来たらネスト数を1減らす。
ネスト数に応じてスペースを表示してから<*>ないしを表示する。

ソース

int main() {
  string s;
  cin >> s;
  int nest = 0;
  int start = 0;
  REP(i, s.size()) {
    if (s[i]=='<') start = i;
    else if (s[i]=='>') {
      string hoge = s.substr(start, i-start+1);
      if (hoge[1] == '/') nest--;
      cout << string(nest*2, ' ') << hoge << endl;
      if (hoge[1] != '/') nest++;
    }
  }
}

C

問題

n人いるホビットをパーティに招待する。
・どの2日をとってきても2日とも招待されているホビットが1人はいる。
・どの3日をとってきても3かとも招待されているホビットが1人もいない。
という制約を満たしながらパーティを出来るだけ長い日数開催する時、その日数と招待の仕方を示せ。

解法

サンプルから分かる通りn=3~5のときは3日しか開けない。
n=6の時を考えると、
1 2 3
1 4 5
2 4 6
3 5 6
とすれば4日開く事が出来る。
これをどのように考えたかを説明する。
まず、1日目は
1 2 3
を招待する。
制約を満たすためには2〜4日目に1, 2, 3それぞれ1人ずつ招待しなければいけないので、
1 2 3
1 * *
2 * *
3 * *
とする必要がある。次に2日目は、2,3は招待できないので、
1 2 3
1 4 5
2 * *
3 * *
となる。上と同様に、3〜4日目に4, 5それぞれ1人ずつ招待しなければいけないので、
1 2 3
1 4 5
2 4 *
3 5 *
となる。同様に、
1 2 3
1 4 5
2 4 6
3 5 6
となり、n=6の場合の答えが得られる。
5日開くには、同様な作成方法を考えることで、
1 2 3 4
1 5 6 7
2 5 8 9
3 6 8 10
4 7 9 10
とする必要がある。
3人、6人、10人、・・・というときに1日開催できる日が増えることが分かる。
この数列(i*(i+1)/2)を先に生成しておき、何日開催できるか求めた上で、上の作成方法をすればよい。

ソース

int main() {
  vector<int> v;
  REP(i, 200) {
    v.push_back(i*(i+1)/2);
  }
  int n;
  cin >> n;
  int day = upper_bound(ALL(v), n)-v.begin();
  cout << day << endl;
  int table[day][day-1];
  int cnt = 1;
  for (int i=0; i<day; ++i) {
    for (int j=i; j<day-1; ++j) {
      table[i][j] = cnt;
      table[j+1][i] = cnt;
      cnt++;
    }
  }
  REP(i, day) {
    REP(j, day-1) {
      if (j) cout << " ";
      cout << table[i][j];
    }
    cout << endl;
  }
}