http://community.topcoder.com/stat?c=problem_statement&pm=11797&rd=14728
(総和の半分) or (総和 - 最大値)
(総和の半分)はすぐに思いつく。
(総和 - 最大値)は分からなかったので小さいケースをいくつか手で試した。
class RollingDiceDivOne {
public:
long long mostLikely(vector <int> D_)
{
vector<lli> D(D_.begin(), D_.end());
if (D.size() == 1) return 1;
const int N = D.size();
sort(D.begin(), D.end());
for (int i = 0; i < N; ++i) {
--D[i];
}
lli a = accumulate(D.begin(), D.end(), 0LL) - D.back();
lli b = accumulate(D.begin(), D.end(), 0LL) / 2;
return N + min(a, b);
}