JZOJ 100041. 【NOIP2017提高A组模拟7.12】列车调度

Description

Description

Input

Input

Output

Output

Sample Input

Sample1:

3
1 2 3

Sample2:

9
1 3 2 4 8 6 9 5 7

Sample Output

Sample1:

3

Sample2:

5

Data Constraint

Data Constraint

Solution

  • 显然,一辆列车开到另一辆列车的后面,一定比新开一条轨道更优。

  • 那么一辆列车要满足什么条件才能停到另一辆的后面呢?

  • 它的序号 X 一定小于前面的列车!不然其他就出不去、无法满足题意了。

  • 于是我们贪心地寻找比 X 大的值且最小的那个位置,停进去即可。

  • 其实我们不需要模拟开出的情况,因为操作是序号更小时才会进行的。

  • 那么当某个序号的列车将要开出时,它的前面一定没有阻挡的列车,因为它们已经开出了。

  • 于是我们只需用一个 Set 维护一下轨道最后一个列车的序号的情况,直接处理即可。

  • 这样的时间复杂度是 O(NlogN)

Code

#include<cstdio>
#include<set>
using namespace std;
inline int read()
{
    int X=0,w=1; char ch=0;
    while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();
    return X*w;
}
set<int>f;
int main()
{
    int n=read(),ans=0;
    for(int i=1;i<=n;i++)
    {
        int x=read();
        f.insert(x);
        set<int>::iterator it=f.find(x);
        if(++it==f.end()) ans++; else f.erase(it);
    }
    printf("%d",ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值