usaco-camp

Short, concise solutions for problems from the USACO camp

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
#include <bits/stdc++.h>
#define f first
#define s second
using namespace std;
using ll = long long;
using pl = pair<ll, ll>;

ll C[5005], D[5005];
pl DP[5005][5005];

int main() {
	ios_base::sync_with_stdio(0), cin.tie(0);

	ll N, T, RA, RB;
	cin >> N >> T >> RA >> RB;
	for (int i = 0; i < N; ++i) cin >> C[i];
	for (int i = 0; i < N; ++i) cin >> D[i];
	
	memset(DP, 63, sizeof(DP));
	DP[0][0] = pl(0, 0);
	ll ans = T;
	for (int i = 0; i <= N; ++i) {
		for (int j = 0; j <= N; ++j) {
			ll r = 1 + i * RA + j * RB;
			if (i < N) {
				ll t = max((C[i] + DP[i][j].s + r - 1) / r, 0ll);
				DP[i + 1][j] = min(pl(DP[i][j].f + t, -t * r + C[i] + DP[i][j].s), DP[i + 1][j]);
			}
			if (j < N) {
				ll t = max((D[j] + DP[i][j].s + r - 1) / r, 0ll);
				DP[i][j + 1] = min(pl(DP[i][j].f + t, -t * r + D[j] + DP[i][j].s), DP[i][j + 1]);
			}
			ans = min(DP[i][j].f + max((T + DP[i][j].s + r - 1) / r, 0ll), ans);
		}
	}
	cout << ans << '\n';
}