알고리즘 공부

백준 퇴사 2(복습)

컴퓨터과학 2023. 10. 12. 21:10

https://www.acmicpc.net/problem/15486

 

15486번: 퇴사 2

첫째 줄에 N (1 ≤ N ≤ 1,500,000)이 주어진다. 둘째 줄부터 N개의 줄에 Ti와 Pi가 공백으로 구분되어서 주어지며, 1일부터 N일까지 순서대로 주어진다. (1 ≤ Ti ≤ 50, 1 ≤ Pi ≤ 1,000)

www.acmicpc.net

다시 풀엇는데 1일이나 걸렸고 

sum[i] = max(sum[i+1], lists[i].cost + sum[nextday]);

 sum[i+1] 누적값에 뒷부분과 현재에서 미래의 가져갈 누적값 합의 비교를 해야하는게 키포인트입니다. 

struct Data {
	int day;
	int cost;
};

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	//퇴사
	//n+1
	//n일 최대한 많은 상담을 하려한다
	//ti pi 
	//n=7
	//비서에게 최대한 많은 상담을 잡으라고 부탁을 했거
	//비서는 하루에 하나씩 서로 다른 사람의 상담을 잡아 놓앗다
	//각각의 상담은 상담을 완료하는데 걸리는 기간 ti pi이러진다
	//n=7
	long long n;
	cin >> n;
	vector<Data>lists;
	vector<int>sum(n+1,0);
	for (long long i = 0; i < n; i++) {
		int day,cost;
		cin >> day >> cost;
		Data d;
		d.day = day;
		d.cost = cost;
		
		lists.push_back(d);
	
	}
	int maxs = 0;
	for (int i = lists.size()-1; i >= 0; i--) {
		int nextday = lists[i].day + i;
		//cout << nextday << ",";
		
		if (nextday > n) {
			sum[i] = sum[i + 1];
			continue;
		}

		sum[i] = max(sum[i+1], lists[i].cost + sum[nextday]);
	}
	
	sort(sum.begin(), sum.end(), greater<>());
	cout << sum[0];
	
	return 0;
}