1 solutions

  • 0
    @ 2024-6-18 13:45:23

    模拟题(100pts)

    • 先把所有果篮整理出来,然后去模拟题目的操作。
    #include<bits/stdc++.h>
    using namespace std;
    struct Node{
        int l,r,num;
    };
    queue<Node> q;
    const int N=2e5+10;
    int a[N];
    bool used[N]; //当前节点是否被用过
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++) //获取每个水果的总类
        {
            scanf("%d",&a[i]);
        }
        for(int i=1;i<=n;i++)
        {
            int j=i;
            while(j<=n&&a[i]==a[j]) j++;
            j--;
            q.push({i,j,a[i]}); //一个水果块
            i=j;
        }
        int cnt=0; //已经取出的水果的数目
        
        while(cnt<n)
        {
            int m=q.size(); //当前的块的个数
            cnt+=m; //结束以后会+m个水果
            queue<Node> q2; //新的块
            for(int i=1;i<=m;i++) //枚举每个水果块
            {
                Node t=q.front(); //获取队头
                q.pop(); //删除
                printf("%d ",t.l);//输出当前队头水果位置
                used[t.l]=1; //标记当前位置已经输出
                while(used[t.l]==1) t.l++; //找到下个没有使用过的位置
                if(t.l<=t.r) //当前块中还有元素
                {
                    if(q2.size()&&q2.back().num==t.num) //之前有块且当前块可以加到之前块之中
                    {
                        q2.back().r=t.r; //更新块的范围
                    }
                    else  //自己是一个块
                    {
                        q2.push(t); //
                    }
                }
            }
            q=q2; //更新水果块
            printf("\n");
        }
        
        return 0;
    }
    
    • 1

    Information

    ID
    1074
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    10
    Tags
    # Submissions
    6
    Accepted
    2
    Uploaded By