1 条题解

  • 0
    @ 2024-10-04 17:18:24

    这个题有很多做法,这里只说最简单的 \(STL\) 做法。
    出题人很善,直接暴力有 \(70pts\)。
    然后考虑优化,将每一个块存储到 \(vector\) 里,删除时如果两个块可以合并,就合并,结束(没啥难度,重在证明,但我不会,没事儿,写就对了)。
    代码(得注意注意边角问题,不然很容易 \(RE90\) 分):

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 2e5+5;
    int a[N];
    int tong[N]; 
    struct node
    {
        int l;
        int r;
        int x;
    };
    vector<node>s;
    signed main()
    {
        int ss = 2;
        int n;
        scanf("%d",&n);
        int l = 1,r = 1;
        for(int i = 1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            if(i == 1)
            {
                r++;
                ss = a[i];
                continue;
            }
            if(a[i]!=ss)
            {
                s.push_back({l,r-1,ss});
                l = i;
            }
            r++;
            ss = a[i];
        }
        if(s.size() == 0)
        {
            s.push_back({1,n,a[n]});
        }
        else if(s[s.size()-1].r<n)
        {
            s.push_back({s[s.size()-1].r+1,n,a[n]});
        }
        while(s.size())
        {
            for(int i = 0;i<s.size();i++)
            {
                while(tong[s[i].l])
                {
                    s[i].l++;
                }
                tong[s[i].l] = 1;
                printf("%d ",s[i].l);
                if(s[i].l+1>s[i].r)
                {
                    s.erase(s.begin()+i);
                    i--;
                }
                else
                {
                    s[i].l++;
                }
            }
            for(int i = 0;i<s.size();i++)
            {
                if(i>0)
                {
                    if(s[i-1].x == s[i].x)
                    {
                        int l = s[i-1].l;
                        s.erase(s.begin()+i-1);
                        s[i-1].l = l;
                        i--;
                    }
                }
            }
            printf("\n");
        }
        return 0;
    }
    
  • 1

[CSP-J 2021 第四题] 小熊的果篮

信息

ID
1014
难度
2
分类
(无)
标签
递交数
1
已通过
1
通过率
100%
上传者