이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define int long long
using namespace std;
#include "biscuits.h"
// dp[cur][nbNecessaire] = nb de facons de choisir y si il faut nbNecessaire et
// qu'on autorise que ceux avec des bits <= cur
//
// dp[cur][nbNecessaire] = dp[cur-1][2 * (max(0, nbNecessaire - a[cur]))]
// + dp[cur-1][2 * (max(0, x + nbNecessaire - a[cur]))]
// dp[-1][0] = 1
//
//
// dp2[cur][nbSupplements] = dp2[cur+1][ (nbSupplements + a[cur]) / 2]
// + dp2[cur+1][(nbSupplements + a[cur] - x) / 2]
//
// dp2[256][nbSupplements] = 1
//
//
// Si a[i] > x on peut ajouter (a[i] - x) / 2 à a[i+1]
// Donc a[i] <= x pour tout i
int count_tastiness(int x, vector<int> a) {
const int MAX = 256;
if (x > (int)1e5)
return 1;
array<vector<int>, 2> arr;
arr.fill(vector<int>(x + 2, 0));
for (int i(0); i < (int)a.size(); ++i) {
if (a[i] > x) {
if (i + 1 == (int)a.size())
a.push_back(0);
a[i + 1] += (a[i] - x) / 2;
a[i] -= 2 * ((a[i] - x) / 2);
}
}
for (int nbRestants = 0; nbRestants <= x + 1; ++nbRestants)
arr[(MAX - 1) % 2][nbRestants] = 1;
for (int i(MAX - 2); i >= 0; --i) {
int cur = i % 2;
int prev = !cur;
for (int nbRestants = 0; nbRestants <= x + 1; ++nbRestants) {
arr[cur][nbRestants] = 0;
int tot = nbRestants;
if (i < (int)a.size())
tot += a[i];
if (tot >= x)
arr[cur][nbRestants] += arr[prev][(tot - x) / 2];
arr[cur][nbRestants] += arr[prev][tot / 2];
}
}
return arr[0][0];
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |