1 solutions
-
0
模拟题(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