当前位置:   article > 正文

栈(括号匹配,机器人相撞)_n个机器人在数轴上,碰撞后运行方向相反

n个机器人在数轴上,碰撞后运行方向相反

一、括号匹配

键入括号序列,文本框初始为空白,随即进行N次操作:

1. L:光标向前移动一个字符,(光标前没有字符则保持不动)(左移)

2. R:光标向后移动一个字符,(光标后没有字符则保持不动)(右移)

3. D:删除光标前的字符(光标前没有字符则保持不动)

4. ‘(’ 或 ‘)’:键入括号

评分标准:

1. 如果括号序列合法,得分为括号最大嵌套深度

2. 如果括号序列不合法,得分为-x,x为使得该序列合法需要插入的最少括号字符个数。

输入 

第一行 操作数 整数 N

第二行 长度为N字符串,每个字符代表一次操作,字符均合法;

输出:一行,空格隔开N个整数,第i个整数,代表第i次操作后的实时分数。

输入

4

()DD

输出

-1 1 -1 0

分析:leecode921,20,1111融合一起 括号的有效性判断+括号的最大深度+有效的最小添加

不能一轮完成,因为涉及回退等,每回操作完的序列,经上述三步操作完成。

第一个为参考答案,第二个自己微改的
 

  1. package zsh;
  2. import java.util.*;
  3. public class Brackets {
  4. //判断是否有效括号
  5. public static boolean isValid(List<Character> list){
  6. Deque<Character> stack = new LinkedList<Character>();
  7. for(char c : list){
  8. if(c == '('){
  9. stack.push(c);
  10. }
  11. else {
  12. if(stack.isEmpty()){
  13. return false;
  14. }
  15. if(stack.peek() == '('){
  16. stack.pop();
  17. }
  18. else{
  19. return false;
  20. }
  21. }
  22. }
  23. if(stack.isEmpty()){
  24. return true;
  25. }
  26. return false;
  27. }
  28. //括号嵌套深度
  29. public static int maxDepth(List<Character> list){
  30. int depth = 0;
  31. int maxDepth = 0;
  32. for(char c : list){
  33. if(c == '('){
  34. depth++;
  35. maxDepth = Math.max(maxDepth, depth);
  36. }
  37. else {
  38. depth--;
  39. }
  40. }
  41. return maxDepth;
  42. }
  43. //差几个使之有效
  44. public static int makeValid(List<Character> list){ //平衡法
  45. int left = 0; //正向匹配,如((()
  46. int right = 0; // 匹配 ))(,记录)数量
  47. for(char c : list){
  48. if(c == '('){
  49. left++;
  50. }
  51. else{
  52. left--;
  53. }
  54. if(left < 0){
  55. left++;
  56. right++;
  57. }
  58. }
  59. return -(left+right);
  60. }
  61. public static void main(String[] args) {
  62. Scanner scanner = new Scanner(System.in);
  63. int optionNum = Integer.valueOf(scanner.nextLine());
  64. String s = scanner.nextLine();
  65. int cur = 0; //光标位置
  66. List<Integer> score = new ArrayList<Integer>();
  67. List<Character> list = new ArrayList<Character>();
  68. for(Character c : s.toCharArray()){
  69. switch(c){
  70. case 'L': //后退
  71. if(cur > 0){
  72. cur--;
  73. }
  74. break;
  75. case 'R': //前进
  76. if(cur < list.size()){
  77. cur++;
  78. }
  79. break;
  80. case 'D':
  81. if(!list.isEmpty()){
  82. list.remove(cur-1);
  83. cur--;
  84. }
  85. break;
  86. case '(':
  87. list.add(cur, c);
  88. cur++;
  89. break;
  90. case ')':
  91. list.add(cur, c);
  92. cur++;
  93. break;
  94. }
  95. if(isValid(list)){
  96. score.add(maxDepth(list));
  97. }
  98. else{
  99. score.add(makeValid(list));
  100. }
  101. }
  102. for(int i = 0; i < optionNum; i++){
  103. System.out.print(score.get(i));
  104. if(i != optionNum-1){
  105. System.out.print(" ");
  106. }
  107. }
  108. }
  109. }

二、机器人相撞

题意:n个机器人在同一数轴上,有的往左走有的往右走,
同一时间在同一个整数点的机器人爆炸,
题解:(和括号匹配相似)
1.按位置排序(离得进的先撞,用栈)
2.分奇数偶数讨论,因为奇数和偶数之间不会爆炸

输入 第一行 机器人个数

其余行 机器人位置  方向

10
94 R
74 L
90 L
75 R
37 R
99 R
62 R
4 L
92 L
44 R

输出

-1 6 23 -1 -1 -1 6 -1 -1 23(竖着打印)

  1. package zsh;
  2. import java.util.*;
  3. public class RobotCollision {
  4. public static void main(String[] args) {
  5. Scanner scanner = new Scanner(System.in);
  6. int total = Integer.parseInt(scanner.nextLine().trim());
  7. int[][] arr = new int[total][3];
  8. Deque<Integer> stack1 = new LinkedList<>(); //存奇数位置
  9. Deque<Integer> stack2 = new LinkedList<>(); //存偶数位置
  10. int num = 0;
  11. for(int i = 0; i < total; i++){
  12. arr[i][0] = scanner.nextInt(); //数轴位置
  13. arr[i][1] = scanner.next().equals("L") ? -1 : 1; //左 -1 右 1
  14. arr[i][2] = num++; //数轴次序
  15. }
  16. Arrays.sort(arr, new Comparator<int[]>() {
  17. @Override
  18. public int compare(int[] o1, int[] o2) {
  19. return o1[0] - o2[0];
  20. }
  21. });
  22. int[] res = new int[total];
  23. Arrays.fill(res, -1);
  24. for(int i = 0; i < total; i++){
  25. if(arr[i][0] % 2 == 1) { //奇数和奇数才能相撞,奇数和偶数不能相撞
  26. if (arr[i][1] == -1) {
  27. if (stack1.isEmpty() || arr[stack1.peek()][1] == -1) {
  28. stack1.push(i);
  29. } else {
  30. int j = stack1.pop();
  31. res[arr[i][2]] = res[arr[j][2]] = (arr[i][0] - arr[j][0]) / 2;
  32. }
  33. } else {
  34. stack1.push(i);
  35. }
  36. }
  37. else{
  38. if (arr[i][1] == -1) {
  39. if (stack2.isEmpty() || arr[stack2.peek()][1] == -1) {
  40. stack2.push(i);
  41. } else {
  42. int j = stack2.pop();
  43. res[arr[i][2]] = res[arr[j][2]] = (arr[i][0] - arr[j][0]) / 2;
  44. }
  45. } else {
  46. stack2.push(i);
  47. }
  48. }
  49. }
  50. for(int k : res){
  51. System.out.println(k);
  52. }
  53. }
  54. }

参考 1525C - Robot Collisions https://codeforces.com/contest/1525/problem/C

https://blog.csdn.net/zhangx0710/article/details/117003988?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.control&spm=1001.2101.3001.4242

  1. /*
  2. 题意:n个机器人,有的往左走有的往右走,
  3. 同一时间在同一个整数点的机器人爆炸,
  4. 碰到墙改变方向
  5. 题解:
  6. 1.按位置排序
  7. 2.分奇数偶数讨论,因为奇数和偶数之间不会爆炸
  8. 3.如果一个向左的机器人,在左端没有其他相同奇偶性的点存在的情况下必然与右端相撞
  9. 4.左扫一次右扫一次
  10. p.s. 学会
  11. int i=vc.back() 最后一个元素
  12. vc.pop_back() 弹出最后一个元素
  13. */
  14. #include<bits/stdc++.h>
  15. using namespace std;
  16. #define x first.first
  17. #define y first.second
  18. #define z second
  19. int T,n,m;
  20. char c;
  21. int main(){
  22. cin>>T;
  23. while(T--){
  24. cin>>n>>m;
  25. vector<pair<pair<int,int>,int>>a(n);
  26. for(int i=0;i<n;i++){
  27. cin>>a[i].x;
  28. }
  29. for(int i=0;i<n;i++){
  30. cin>>c;
  31. a[i].y=(c=='L'? -1:1);
  32. a[i].z=i;
  33. }
  34. sort(a.begin(),a.end());
  35. vector<int>ans(n,-1);
  36. vector<vector<int>>p(2);
  37. for(int i=0;i<n;i++){
  38. int r=a[i].x%2;
  39. if(a[i].y==-1){
  40. if(p[r].empty()){
  41. p[r].push_back(i);
  42. }
  43. else {
  44. int j=p[r].back();
  45. p[r].pop_back();
  46. ans[a[i].z] = ans[a[j].z] = (a[i].x - (a[j].y == 1 ? a[j].x : -a[j].x)) / 2;
  47. //y=1,一个回合左右相向相撞; y=-1, 左左转向第二回合相撞
  48. }
  49. }else{
  50. p[r].push_back(i); //存的是右向,消除左向
  51. }
  52. }
  53. for(int r=0;r<2;r++){ //剩下的是右右 和 左向在右,右向在左情况
  54. while(p[r].size()>1){
  55. int i=p[r].back();
  56. p[r].pop_back();
  57. int j=p[r].back();
  58. p[r].pop_back();
  59. ans[a[i].z]=ans[a[j].z]=(2*m-a[i].x-(a[j].y==1?a[j].x:-a[j].x))/2;
  60. //y=1,同右向;y = -1,左向在右,右向在左,第二回合相遇
  61. }
  62. }
  63. for(int i=0;i<n;i++){
  64. cout<<ans[i]<<' ';
  65. }
  66. cout<<endl;
  67. }
  68. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/698300
推荐阅读
相关标签
  

闽ICP备14008679号