821C - Okabe and Boxes ——优先队列+手动模拟栈

野性酷女 2022-06-13 03:52 223阅读 0赞

Think:
1题意:模拟一个栈,有两种操作,栈顶增加一个元素,栈顶移除一个元素,要求元素按照编号大小移除,移除前可以选择是否调整栈内元素顺序,询问最少调整次数
2方法:优先队列+手动模拟栈
3反思:注意暴力模拟+排序会超时

codeforces题目链接

以下为Accepted代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 3e5 + 4;
  4. priority_queue <int, vector<int>, greater<int> > q;
  5. int tp, link[N];
  6. int main(){
  7. int n, i, x, num;
  8. char st[14];
  9. scanf("%d", &n);
  10. getchar();
  11. tp = 0, num = 0;
  12. for(i = 1; i <= 2*n; i++){
  13. scanf("%s", st);
  14. if(st[0] == 'a'){
  15. scanf("%d", &x);
  16. q.push(x);
  17. link[tp++] = x;
  18. }
  19. else if(st[0] == 'r'){
  20. if(tp){
  21. int t = q.top();
  22. if(t == link[tp-1]){
  23. tp--;
  24. q.pop();
  25. }
  26. else {
  27. num++;
  28. tp = 0;
  29. q.pop();
  30. }
  31. }
  32. else {
  33. q.pop();
  34. }
  35. }
  36. }
  37. printf("%d\n", num);
  38. return 0;
  39. }

发表评论

表情:
评论列表 (有 0 条评论,223人围观)

还没有评论,来说两句吧...

相关阅读