コードは短い。
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; }
まとめ
コードは短いけど、考察はしんどそう。