Comment detail
議席数をドント方式で (Nested Flatten)
maxにもkeyパラメータがあったとは知らなかったです。
ええ、本当はall()とany()にも欲しいんですけどね(^^; (トランプのお題では自前で定義)
上のコードをC++(STL)に移植しました。(カバレッジ稼ぎ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include <iostream>
#include <algorithm>
#include <functional>
#include <iterator>
#include <vector>
class party
{
public:
party(size_t vote) : _vote(vote), _sheet(0) {}
friend bool operator<(const party& lhs, const party& rhs)
{
return lhs.key() < rhs.key();
}
size_t sheet() const { return _sheet; }
void add_sheet() { ++_sheet; }
private:
size_t _vote, _sheet;
double key() const
{
return static_cast<double>(_vote) / (_sheet + 1);
}
};
void solve(size_t sheet_count, size_t* beg, size_t* end)
{
if (beg == end) return;
std::vector<party> parties;
std::copy(beg, end, std::back_inserter(parties));
for (size_t i = 0; i < sheet_count; ++i)
{
std::max_element(parties.begin(), parties.end())->add_sheet();
}
std::transform(parties.begin(), parties.end(), beg, std::mem_fun_ref(&party::sheet));
}
int main()
{
size_t datas[] = {123, 4, 56, 78};
size_t* beg = datas;
size_t* end = datas + sizeof(datas) / sizeof(*datas);
solve(100, beg, end);
std::copy(beg, end, std::ostream_iterator<size_t>(std::cout, " "));
}
|





ocean
#1216()
[
Python
]
Rating1/1=1.00
Rating1/1=1.00-0+
2 replies [ reply ]