CodeForces - 1055B Alice and Hairdresser(思维+模拟)

本文介绍了一道关于模拟剪发过程的算法题。题目描述了一个角色拥有多根不同长度的头发,当头发长度超过一定阈值时需要剪短。文章分析了解题思路,指出实际上头发长度并未真正改变,并提供了一种通过判断相邻头发状态来优化剪发次数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目: 传送门

题意: Ailce 有n根头发,每根头发长度为ai,头发可能会增长,如果头发长度大于l就需要被剪,询问如果Ailce去剪头发,需要多久(规定剪一次需要1s,并且如果很多需要剪的头发相邻,可以一次都剪掉)。

题目: 刚拿到题目的时候想的很复杂,本来打算用线段树做的,但是后来仔细想想其实并没有这么难.
题目中说明了剪头发只是想象出来的,即头发长度没有被剪掉,只是询问现在如果去剪头发需要的时间。所以在题目中头发的长度只会不断增长而不会减少.
我们可以先分情况讨论可能出现的可能,如果该根头发是要剪的,所以它再增长的话是不会对所剪的次数造成影响的.如果该头发起初不要剪增长了之后要剪,我们需要讨论与它相邻的头发的状态,如果只有一边的头发需要剪,则不会造成影响,如果两边都是要剪的头发,则说明把两部分需要剪的头发连了起来,所以要剪的次数就会-1,如果都不要剪,则这根头发要单独再剪一次,结果增加.

AC代码:

long long a[100100];

int main() {
    long long now = 0;//表示当前需要剪的次数
    long long n,m,l;
    cin>>n>>m>>l;
    for(int i = 0;i<n;i++) {
        cin>>a[i];
        if(a[i]>l) {
            if(i==0) {
                now++;
            }
            else {
                if(a[i-1]<=l) now++; //如果前一个不需要剪,则次数要增加
            }
        }
    }
    while(m--) {
        int cmp;
        cin>>cmp;
        if(cmp==0) {
            cout<<now<<endl;
        }
        else {
            int p,d;
            cin>>p>>d;
            p-=1;//题目是从1计数,而我是从0计数。
            if(a[p]>l) continue;//如果本身大于就不会影响
            a[p] +=d;
            if(a[p]<=l) continue;//如果增长了之后还是小于也不会影响
            if(p!=0) {//防止越界
                if(p==n-1) {
                    if(a[p-1]<=l) now++;
                } 
                else {
                    if(a[p-1]>l&&a[p+1]>l) now--;//左右两边都要剪结果减小
                    else if(a[p-1]<=l&&a[p+1]<=l) now++;//左右两边都不要剪则结果增加
                }
            }
            else {
                if(a[p+1]<=l) now++;
            }
        }
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值