专栏文章
题解:P14093 [ICPC 2023 Seoul R] Product Delivery
P14093题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minpqg6z
- 此快照首次捕获于
- 2025/12/02 06:20 3 个月前
- 此快照最后确认于
- 2025/12/02 06:20 3 个月前
Update 2025/10/7
感谢songhaoxuan12345678指出的不足。添加了题意解释与具体思路。
题意解释
有 个城市,第 个城市有需求 。现有一种操作,每次操作能使得前 个城市供应需求,但第 个城市的供应量 。求最少操作能满足需求。
思路
不难看出是贪心。为找出贪心策略,使用归纳法。
- 若序列 为递增序列:易知次数为 。
- 若序列 为两个递增序列相连形成的序列(即在递增序列中出现了 ):因为序列中出现两个极值,所以在满足第一个极值的需求时第二个极值无法被满足,故次数为 。
- 若序列 为三个递增序列相连形成的序列(即在递增序列中出现了两个 ):同理,在满足前两个极值时第三个不能满足,故次数为 。
- 若序列 为 个递增序列相连形成的序列(即在递增序列中出现了 个 ):在满足前 个极值时第 个不能满足,故次数为 。
故本题就是要求数列中最长不下降子序列的总个数。因为有范围的限制,我们可以这么考虑:
- 若子序列的最大左边界大于目前元素的右边界,则重新划分子序列。
- 否则子序列更新最大左边界。
注意,因为子序列的个数至少为 1,所以最后的答案要加 1。
AC Code:
CPP#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;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...