// D (compile time)
// $ dmd -J`pwd` -o- B.d 2> out.txt
import std.algorithm;
import std.array;
import std.conv;
import std.string;
string solveAll(string s)
{
return s.splitLines().solveEach(1);
}
string solveEach(string[] lines, int i)
{
if( i == lines.length )
return "";
// std.algorithm.map doesn't work in compile time yet.
int[] t;
foreach(s; lines[i].split())
t ~= s.to!int();
return text("Case #", i, ": ", solve(t[0], t[1], t[2], t[3..$]), "\n", lines.solveEach(i+1));
}
int solve(int N, int S, int P, int[] T)
{
int[] dp = new int[S+1];
dp[0] = 0;
foreach(x; 1..S+1) dp[x] = int.min;
foreach(t; T) {
bool non, sup;
if(t%3==0){
non = (t/3)>=P;
sup = t>=3 && (t/3+1)>=P;
}
else if(t%3==1){
non = (t/3+1)>=P;
sup = t>=4 && (t/3+1)>=P;
}
else{
non = (t/3+1)>=P;
sup = (t/3+2)>=P;
}
int[] dp2 = new int[S+1];
foreach(x; 0..S+1)
dp2[x] = dp[x] + (non ? 1 : 0);
foreach(x; 0..S)
dp2[x+1] = max(dp2[x+1], dp[x] + (sup ? 1 : 0));
dp = dp2;
}
return dp[S];
}
immutable inputFileName = "B.in";
version(RunTime)
{
import std.file, std.stdio;
void main() { inputFileName.readText().solveAll().write(); }
}
else
{
pragma(msg, import(inputFileName).solveAll());
}
Ly8gRCAoY29tcGlsZSB0aW1lKQovLyAgICQgZG1kIC1KYHB3ZGAgLW8tIEIuZCAyPiBvdXQudHh0CmltcG9ydCBzdGQuYWxnb3JpdGhtOwppbXBvcnQgc3RkLmFycmF5OwppbXBvcnQgc3RkLmNvbnY7CmltcG9ydCBzdGQuc3RyaW5nOwoKc3RyaW5nIHNvbHZlQWxsKHN0cmluZyBzKQp7CglyZXR1cm4gcy5zcGxpdExpbmVzKCkuc29sdmVFYWNoKDEpOwp9CgpzdHJpbmcgc29sdmVFYWNoKHN0cmluZ1tdIGxpbmVzLCBpbnQgaSkKewoJaWYoIGkgPT0gbGluZXMubGVuZ3RoICkKCQlyZXR1cm4gIiI7CgoJLy8gc3RkLmFsZ29yaXRobS5tYXAgZG9lc24ndCB3b3JrIGluIGNvbXBpbGUgdGltZSB5ZXQuCglpbnRbXSB0OwoJZm9yZWFjaChzOyBsaW5lc1tpXS5zcGxpdCgpKQoJCXQgfj0gcy50byFpbnQoKTsKCXJldHVybiB0ZXh0KCJDYXNlICMiLCBpLCAiOiAiLCBzb2x2ZSh0WzBdLCB0WzFdLCB0WzJdLCB0WzMuLiRdKSwgIlxuIiwgbGluZXMuc29sdmVFYWNoKGkrMSkpOwp9CgppbnQgc29sdmUoaW50IE4sIGludCBTLCBpbnQgUCwgaW50W10gVCkKewoJaW50W10gZHAgPSBuZXcgaW50W1MrMV07CglkcFswXSA9IDA7Cglmb3JlYWNoKHg7IDEuLlMrMSkgZHBbeF0gPSBpbnQubWluOwoKCWZvcmVhY2godDsgVCkgewoJCWJvb2wgbm9uLCBzdXA7CgkJaWYodCUzPT0wKXsKCQkJbm9uID0gKHQvMyk+PVA7CgkJCXN1cCA9IHQ+PTMgJiYgKHQvMysxKT49UDsKCQl9CgkJZWxzZSBpZih0JTM9PTEpewoJCQlub24gPSAodC8zKzEpPj1QOwoJCQlzdXAgPSB0Pj00ICYmICh0LzMrMSk+PVA7CgkJfQoJCWVsc2V7CgkJCW5vbiA9ICh0LzMrMSk+PVA7CgkJCXN1cCA9ICh0LzMrMik+PVA7CgkJfQoKCQlpbnRbXSBkcDIgPSBuZXcgaW50W1MrMV07CgkJZm9yZWFjaCh4OyAwLi5TKzEpCgkJCWRwMlt4XSA9IGRwW3hdICsgKG5vbiA/IDEgOiAwKTsKCQlmb3JlYWNoKHg7IDAuLlMpCgkJCWRwMlt4KzFdID0gbWF4KGRwMlt4KzFdLCBkcFt4XSArIChzdXAgPyAxIDogMCkpOwoJCWRwID0gZHAyOwoJfQoKCXJldHVybiBkcFtTXTsKfQoKaW1tdXRhYmxlIGlucHV0RmlsZU5hbWUgPSAiQi5pbiI7Cgp2ZXJzaW9uKFJ1blRpbWUpCnsKCWltcG9ydCBzdGQuZmlsZSwgc3RkLnN0ZGlvOwoJdm9pZCBtYWluKCkgeyBpbnB1dEZpbGVOYW1lLnJlYWRUZXh0KCkuc29sdmVBbGwoKS53cml0ZSgpOyB9Cn0KZWxzZQp7CglwcmFnbWEobXNnLCBpbXBvcnQoaW5wdXRGaWxlTmFtZSkuc29sdmVBbGwoKSk7Cn0K