SRM 506 div2 mid SlimeXSlimesCity

問題

http://www.topcoder.com/stat?c=problem_statement&pm=11154&rd=14435 (要ログイン)

  • 初期状態の都市のサイズが population[i] (i = 0, .., N-1) で与えられる。
  • 任意の順番で、都市を2つづつ選び、それらを併合して1つの都市にする。最終的に1つだけが残るまで続ける。
    • 新しい都市の名前は、常に大きい方の都市の名前とする
    • 併合される都市のサイズが同じ時は、どちらの名前を残してもよい。
  • 最後に残る都市の名前としてあり得るのは何種類?

方針

都市 i に対して、最小の都市を順番に併合していく。この時、全ての都市を併合する前に都市 i が最小となってしまったら、どうやっても都市 i が残ることは出来ない。

回答

#include <list>
#include <sstream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
#include <utility>
#include <set>
#include <cctype>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iterator>


using namespace std;
typedef unsigned long long ull;

class SlimeXSlimesCity{
public:
  int merge(vector <int> population){
    sort(population.begin(), population.end());
    const size_t n = population.size();
    vector<ull> v(n);
    copy(population.begin(), population.end(), v.begin());
    int ret = 0;
    for(size_t i = 0; i < n; ++i){
      if(check(v, i)){
	ret++;
      }
    }
    return ret;
  }

  bool check(vector<ull> l, size_t pos){
    size_t i;
    for(i=0; i < pos; ++i){
      l[pos] += l[i];
    } // i = pos
    while(i < l.size() - 1){
      if(l[i + 1] <= l[i]){
	l[i + 1] += l[i];
	i++;
      }
      else{
	break;
      }
    }
    return i == (l.size() - 1);
  }



};