Submission #106226

#TimeUsernameProblemLanguageResultExecution timeMemory
106226SecretAgent007Wiring (IOI17_wiring)C++17
20 / 100
161 ms2168 KiB
#include <bits/stdc++.h>
#include "wiring.h"

using namespace std;

vector< vector< int > > memo;

int dp(int n, int m, vector< int > red, vector< int > blue){
		
	if(n < 0 || m < 0){
		return INT_MAX;
	}
	
	if(n == 0 && m == 0){
		return memo[n][m] = abs(red[n]-blue[m]);
	}
	
	if(memo[n][m] != -1) return memo[n][m];
	
	return memo[n][m] = min(dp(n-1, m-1, red, blue), min(dp(n-1,m,red, blue), dp(n,m-1,red,blue))) + abs(red[n]-blue[m]);
	
}

long long min_total_length (vector <int> red, vector <int> blue) {

	int n = red.size();
	int m = blue.size();
	
	if(n < 500 && m < 500){
	
		memo.resize(n, vector<int>(m));
		
		for(int i = 0; i < n; i++){
			for(int j = 0; j < m; j++){
				memo[i][j] = -1;
			}
		}
		
		return dp(n-1,m-1,red,blue); 
		
	}
	
	long long tot = 0;
	
	int f = 0;
	int s = 0;
	
	while(f < n && s < m){
		tot += blue[s]-red[f];
		s++;
		f++;
	}
	
	while(f < n){
		tot += blue[0]-red[f];
		f++;
	}

	while(s < m){
		tot += blue[s]-red.back();
		s++;
	}

	return tot;

}
/*
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	int n, m;
	
	cin >> n >> m;
	
	vector< int > red(n);
	vector< int > blue(m);
	
	for(int i = 0; i < n; i++){
		cin >> red[i];
	}
	for(int i = 0; i < m; i++){
		cin >> blue[i];
	}
	
	cout << min_total_length(red, blue) << endl;
}*/

#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...