답안 #216838

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
216838 2020-03-28T07:46:19 Z oolimry Collecting Stamps 3 (JOI20_ho_t3) C++14
0 / 100
5 ms 384 KB
#include <bits/stdc++.h>
#define x first
#define t second

using namespace std;
typedef pair<long long, long long> ii;
long long inf = (1LL << 48LL);
vector<ii> arr = {ii({0,0})};

static long long memo[205][205][205];
long long n, L; 


long long dp(int pos, int bound, int taken){
	if(memo[pos][bound][taken] != -1) return memo[pos][bound][taken];
	//cout << pos << " " << bound << " " << taken << endl;
	
	long long ans = inf;
	if(pos == bound){
		if(pos == 0 && taken == 0) return 0;
		else return inf;
	}
	if(taken < 0) return inf;
	if(pos == 0) return inf;
	
	int pos2;
	long long dPos, dCross;
	if(pos < bound){
		pos2 = pos-1;
		if(pos2 == -1) pos2 = n;
	}
	else{
		pos2 = pos+1;
		if(pos2 == n+1) pos2 = 0;
	}
	
	if(pos > pos2) dPos = arr[pos].x - arr[pos2].x;
	else dPos = arr[pos2].x - arr[pos].x;
	
	//if(bound > bound2) dBound = arr[bound].x - arr[bound2].x;
	//else dBound = arr[bound2].x - arr[bound].x;
	
	///move from bound to pos
	if(bound > pos){
		dCross = L - (arr[bound].x - arr[pos].x);
	}
	else{
		dCross = L - (arr[pos].x - arr[bound].x);
	}
	
	ans = min(ans, dp(pos2, bound, taken) + dPos);
	ans = min(ans, dp(bound, pos2, taken) + dCross);
	
	if(dp(pos2, bound, taken - 1) + dPos <= arr[pos].t){
		ans = min(dp(pos2, bound, taken - 1) + dPos, ans);
	}
	
	if(dp(bound, pos2, taken - 1) + dCross <= arr[pos].t){
		ans = min(dp(bound, pos2, taken - 1) + dCross, ans);
	}
	
	memo[pos][bound][taken] = ans;
	return ans;
}
int main(){
	//freopen("i.txt","r",stdin);
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	
	cin >> n >> L;
	
	for(int i = 0;i < n;i++){
		arr.push_back(ii(0,0));
	}
	
	for(int i = 1;i <= n;i++) cin >> arr[i].x;
	for(int i = 1;i <= n;i++) cin >> arr[i].t;
	
	for(int i = 0;i <= n;i++){
		for(int j = 0;j <= n;j++){
			for(int k = 0;k <= n;k++){
				memo[i][j][k] = -1;
			}
		}
	}
	

	long long ANS = 0;
	for(long long taken = 0;taken <= n;taken++){
		for(int i = 0;i <= n;i++){
			for(int j = 0;j <= n;j++){
				long long DP = dp(i,j,taken);
				if(DP < inf){
					ANS = max(ANS, taken);
				}
				//cout << dp(i, j, taken) << " " << taken << endl;
			}
		}
	}
	
	cout << ANS;
	
	
}




# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Incorrect 5 ms 384 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Incorrect 5 ms 384 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Incorrect 5 ms 384 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Incorrect 5 ms 384 KB Output isn't correct
3 Halted 0 ms 0 KB -