Submission #1345636

#TimeUsernameProblemLanguageResultExecution timeMemory
1345636Jawad_Akbar_JJPotatoes and fertilizers (LMIO19_bulves)C++20
24 / 100
1095 ms16092 KiB
#include <iostream>

using namespace std;
#define int long long
const int N = 1<<20, M = 30005;
long long Pre[N], Suf[N], Pct[N], Sct[N], a[N], b[N];
int dp[2][M * 2], val[M * 2];

signed main(){
	long long n, Ans = 1e18, Sum = 0;
	cin>>n;

	for (int i=1;i<=n;i++){
		cin>>a[i]>>b[i];
		int k = min(a[i], b[i]);
		a[i] -= k, b[i] -= k;
	}

	for (int i=1;i<=n;i++){
		Pre[i] = Pre[i-1] + a[i] - b[i];
		Pct[i] = Pct[i-1] + abs(Pre[i]);
	}

	if (Pre[n] == 0)
		return cout<<Pct[n]<<'\n', 0;

	for (int i=0;i<2 * M;i++)
		dp[0][i] = dp[1][i] = 1e15;

	dp[0][M] = 0;

	for (int i=1;i<=n;i++){
		if (a[i] > 0){
			for (int j=0;j+a[i]<2 * M;j++)
				val[j + a[i]] = dp[0][j];

			for (int j=2 * M - 1, vl = 1e15;j>=M;j--){
				vl = min(vl, val[j]);
				dp[1][j] = min(dp[1][j], vl + abs(j - M));
			}

		}
		else{
			for (int j=2*M-1;j - b[i] >= 0;j--)
				dp[1][j - b[i]] = dp[0][j] + abs(j - b[i] - M);
		}
		for (int j=0;j<M * 2;j++){
			dp[0][j] = dp[1][j], dp[1][j] = 1e15;
			// if (dp[0][j] >= 1e15)
			// 	cout<<"__ ";
			// else
			// 	cout<<dp[0][j]<<' ';
		}
		// cout<<'\n';
	}
	cout<<dp[0][M]<<'\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...