Submission #712508

#TimeUsernameProblemLanguageResultExecution timeMemory
712508vjudge1Tortoise (CEOI21_tortoise)C++11
48 / 100
3074 ms430904 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define _all(i, a, b) for (int i = (a); i <= (int)(b); ++i)
int D[603][302][302][2];  /// 当前时间、当前位置、山数、手数 ->
                          ///  最后一座山的位置
const int INF = 0x3f3f3f3f;
int solve(int n) {
  int ans = 0;
  vector<int> A(n + 1), S(n + 1);
  _all(i, 1, n) cin >> A[i], S[i] = S[i - 1] + max(A[i], 0);
  memset(D, 0x3f, sizeof(D));
  D[0][1][0][0] = 0;
  _all(t, 0, 2 * n + 1) _all(i, 1, n) _all(j, 0, n) {
    int *d = D[t][i][j];
    _all(c, 0, 1) if (d[c] < INF) ans = max(ans, j);  // 更新答案
    /// 不打发时间的活动
    if (A[i] == -1) d[0] = min(d[0], d[1]);         /// 放在山里
    if (A[i] > 0 && d[0] < S[i] && i + i - 2 >= t)  // 假的?
      D[t][i][j + 1][1] = min(D[t][i][j + 1][1], max(d[0], S[i - 1]) + 1);
    _all(c, 0, 1) {  /// 移动
      D[t + 1][i - 1][j][c] = min(D[t + 1][i - 1][j][c], d[c]);
      D[t + 1][i + 1][j][c] = min(D[t + 1][i + 1][j][c], d[c]);
    }
  }
  return S[n] - ans;
}
int main() {
  for (int n; cin >> n;)
    printf("%d\n", solve(n));
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...