1 条题解

  • 0
    @ 2025-11-26 21:10:36

    Written by @Yue_chen

    题意:

    给定 n 组人,要么是 1个, 要么是两个。

    给定一排长度为 L 的座位 (所有人数之和必然等于L)

    n组人依次来占座位,在最坏情况下是否能保证每一组人都能连坐在一起。

    思路:

    思考发现,只有当后面的人是2个的时候可能会做不到一起。

    直接把前面的每组都想象的比较邪恶,每组都隔一个位置再坐,这样可以让后面2个人一起的队伍没法插空。

    相当于把前面每一组占用的座位都+1

    当最后没法隔着坐,并且挤不下时,判断还有没有2人一组的队伍还没坐,如果有就是“No”

    否则是"Yes"

    需要注意一下,如果最后剩了两个座位,并且刚好是两人一组过来,他们是可以做得下的,只不过他们占用的座位就没办法+1了。

    时间复杂度O(n)

    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    
    using i64 = long long;
    
    void solve() {
        int n, L; cin>>n>>L;
        
        for(int i=1; i<=n; ++i) {
            int x; cin>>x;
            if(L >= x+1) L -= x+1;//隔着坐能否坐下
            else if(L >= x) L -= x;//最后挤一挤能否坐下
            else {//只能挤着坐了,且空隙全为1,出现2人一起的就寄
                if(x == 2) {
                    cout<<"No\n";
                    return ;
                }
            }
            
        }
        cout<<"Yes\n";
    }
    
    signed main(void) {
        ios::sync_with_stdio(false); cin.tie(nullptr);
        
        int t=1; //cin>>t;
        while (t--) solve();
        return 0;
    }
    

    信息

    ID
    124
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    183
    已通过
    23
    上传者