题解:P14093 [ICPC 2023 Seoul R] Product Delivery

· · 题解

Update 2025/10/7

感谢@songhaoxuan12345678指出的不足。添加了题意解释与具体思路。

题意解释

原题翻译

n 个城市,第 i 个城市有需求 S_i \in [l_i,m_i]。现有一种操作,每次操作能使得前 k 个城市供应需求,但第 i 个城市的供应量 c_i \le c_{i+1}。求最少操作能满足需求。

思路

不难看出是贪心。为找出贪心策略,使用归纳法。

故本题就是要求数列中最长不下降子序列的总个数。因为有范围的限制,我们可以这么考虑:

注意,因为子序列的个数至少为 1,所以最后的答案要加 1。

AC Code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int n,l[maxn],r[maxn],ans=0;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i) scanf("%d%d",&l[i],&r[i]);
    int maxp=0;
    for(int i=1;i<=n;++i){
        if(maxp>r[i]){
            maxp=l[i];
            ans++;
        }else maxp=max(maxp,l[i]);
    }
    cout<<ans+1;
    return 0;
}