kmjp's blog

競技プログラミング参加記です

Codeforces #751 Div1 : D. Difficult Mountain

コードは短い。
https://codeforces.com/contest/1601/problem/D

問題

N人の登山家が山を登る。
初期状態で山の難易度はDである。
各登山家iは、パラメータとしてスキルS[i]と勤勉さA[i]が与えられる。

各登山家は、自身のスキルが山の難易度以上である場合、山を登り切ることができる。
ただしその後、山の難易度が、A[i]未満の場合、A[i]になる。

適切な順で登山家の登山順を定めたとき、山を登り切ることができるのは最大何人か。

解法

(max(S[i],A[i]), S[i], A[i])というタプルをソートし、その順で登山を試みると良い。

int N,D;
int S[505050],A[505050];

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>N>>D;
	vector<vector<int>> V;
	FOR(i,N) {
		cin>>S[i]>>A[i];
		V.push_back({max(S[i],A[i]),S[i],A[i]});
	}
	int ret=0;
	sort(ALL(V));
	FORR(a,V) {
		if(a[1]>=D) {
			ret++;
			D=max(D,a[2]);
		}
	}
	cout<<ret<<endl;
		
}

まとめ

コードは短いけど、考察はしんどそう。