Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define fi first
- #define se second
- #define pb push_back
- #define pf push_front
- #define popb pop_back
- #define popf pop_front
- #define ins insert
- #define pq priority_queue
- #define minele min_element
- #define maxele max_element
- #define lb lower_bound
- #define ub upper_bound
- #define cnt_bit __builtin_popcount
- #define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
- using namespace std;
- typedef long long ll;
- typedef pair<ll, ll> pll;
- typedef pair<int, int> pii;
- int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1};
- int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1};
- int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1};
- const ll oo = 1e16;
- const ll maxN = 1e6;
- void maximize(int &a, int b) {
- a = max(a, b);
- }
- void minimize(int &a, int b) {
- a = min(a, b);
- }
- ll a[3030], b[3030], c[3030];
- ll dp[220][220][220];
- ll f[3][3030], nf[3][3030], LMin[3030], RMin[3030];
- struct P {
- int a, b, c;
- } d[3030];
- bool cmp(P _a, P _b) {
- return (_a.b - _a.c < _b.b - _b.c);
- }
- void solve() {
- int n; cin >> n;
- for(int i = 1; i <= n; i++) cin >> a[i] >> b[i] >> c[i];
- if(n <= 200) {
- for(int i = 0; i <= n; i++) {
- for(int j = 0; j <= n; j++) {
- for(int k = 0; k <= n; k++) dp[i][j][k] = oo;
- }
- }
- dp[0][0][0] = 0;
- for(int i = 1; i <= n; i++) {
- for(int j = 0; j <= i; j++) {
- for(int k = 0; k <= i - j; k++) {
- dp[i][j][k] = dp[i - 1][j][k] + a[i];
- if(j > 0) {
- dp[i][j][k] = min(dp[i][j][k], dp[i - 1][j - 1][k] + (b[i] - (j - 1)));
- }
- if(k > 0) {
- dp[i][j][k] = min(dp[i][j][k], dp[i - 1][j][k - 1] + (c[i] - (k - 1)));
- }
- }
- }
- }
- ll ans = oo;
- for(int i = 0; i <= n; i++) {
- for(int j = 0; j <= n - i; j++)
- ans = min(ans, dp[n][i][j]);
- }
- cout << ans;
- } else {
- ll tot = 0;
- for(int i = 1; i <= n; i++) {
- d[i].a = a[i];
- d[i].b = b[i];
- d[i].c = c[i];
- tot = tot + a[i];
- }
- for(int i = 1; i <= n; i++) {
- d[i].b -= d[i].a;
- d[i].c -= d[i].a;
- }
- for(int i = 0; i <= n + 1; i++) {
- for(int j = 0; j <= n + 1; j++) {
- f[0][j] = f[1][j] = -1;
- LMin[i] = RMin[i] = oo;
- }
- }
- sort(d + 1, d + 1 + n, cmp);
- f[0][0] = 0;
- for(int i = 1; i <= n; i++) {
- for(int j = 0; j <= i; j++) {
- nf[0][j] = oo;
- if(f[0][j] != -1) nf[0][j] = f[0][j];
- if(j > 0 && f[0][j - 1] != -1) nf[0][j] = min(nf[0][j], f[0][j - 1] + (d[i].b - (j - 1)));
- LMin[i] = min(LMin[i], nf[0][j]);
- if(nf[0][j] == oo) nf[0][j] = -1;
- }
- for(int j = 0; j <= i; j++) {
- f[0][j] = nf[0][j];
- }
- }
- f[1][0] = 0;
- for(int i = n; i >= 1; i--) {
- for(int j = 0; j <= (n - i + 1); j++) {
- nf[1][j] = oo;
- if(f[1][j] != -1) nf[1][j] = f[1][j];
- if(j > 0 && f[1][j - 1] != -1) nf[1][j] = min(nf[1][j], f[1][j - 1] + (d[i].c - (j - 1)));
- RMin[i] = min(RMin[i], nf[1][j]);
- if(nf[0][j] == oo) nf[1][j] = -1;
- }
- for(int j = 0; j <= (n - i + 1); j++) {
- f[1][j] = nf[1][j];
- }
- }
- ll ans = min(RMin[1], LMin[n]);
- for(int i = 1; i < n; i++) ans = min(ans, LMin[i] + RMin[i + 1]);
- cout << ans + tot;
- }
- }
- int main()
- {
- ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement