250 :
やるだけ。やるだけにも関わらずFailedSystemTest。
500 :
メモ化した。memo[区間の先端][区間の終端][今何匹か]
貪欲とか2分探索みたいな解法の人もいた。
1000 :
読んでない。
250
本番後に通したヤツ。
class FoxAndKgram {
public:
int maxK(vector <int> L)
{
int ret = 0;
map<int, int> cnt;
for (int i = 0; i < (int)L.size(); ++i) {
++cnt[L[i]];
}
const map<int, int> tmp = cnt;
for (int k = 1; k <= 50; ++k) {
cnt = tmp;
int n = cnt[k];
for (int i = 1; i < (int)k; ++i) {
if (i == k - i - 1) {
n += cnt[i] / 2;
cnt[i] /= 2;
} else {
int mn = min(cnt[i], cnt[k - i - 1]);
n += mn;
cnt[i] -= mn;
cnt[k - i - 1] -= mn;
}
}
if (k <= n) ret = max(ret, k);
}
return ret;
}
};
500
本番中に通したヤツ。
const int N = 50 + 5;
lli memo[N][N][N];
vector<int> W;
int S;
lli rec(int A, int B, int n)
{
lli &ret = memo[A][B][n];
if (ret != -1) return ret;
if (A + 1 == B) return ret = W[A];
lli mn = 1LL << 60;
if (n < B - A) {
mn = min(mn, rec(A, B, min(B - A, n * 2)) + S);
}
if (1 < n) {
for (int i = A + 1; i < (int)B; ++i) {
lli mx = 0;
for (int j = 1; j < (int)n; ++j) {
lli a = rec(A, i, n - j);
lli b = rec(i, B, j);
mx = max(mx, max(a, b));
}
mn = min(mn, mx);
}
}
return ret = mn;
}
class FoxAndDoraemon {
public:
int minTime(vector <int> workCost, int splitCost)
{
W = workCost;
S = splitCost;
sort(W.begin(), W.end());
fill(&memo[0][0][0], &memo[N - 1][N - 1][N], -1);
return rec(0, W.size(), 1);
}
};