第十二届蓝桥杯A组省赛试题 I: 双向排序(Java)

简介: 第十二届蓝桥杯A组省赛试题 I: 双向排序(Java)

试题 I: 双向排序

本题总分:25 分


【问题描述】

给定序列 (a1, a2, · · · , an) = (1, 2, · · · , n),即 ai = i。

小蓝将对这个序列进行 m 次操作,每次可能是将 a1, a2, · · · , aqi 降序排列,

或者将 aqi , aqi+1, · · · , an 升序排列。

请求出操作完成后的序列。


【输入格式】

输入的第一行包含两个整数 n, m,分别表示序列的长度和操作次数。

接下来 m 行描述对序列的操作,其中第 i 行包含两个整数 pi, qi 表示操作

类型和参数。当 pi = 0 时,表示将 a1, a2, · · · , aqi 降序排列;当 pi = 1 时,表示

将 aqi , aqi+1, · · · , an 升序排列。


【输出格式】

输出一行,包含 n 个整数,相邻的整数之间使用一个空格分隔,表示操作

完成后的序列。


【样例输入】

3 3

0 3

1 2

0 2


【样例输出】

3 1 2


【样例说明】

原数列为 (1, 2, 3)。

第 1 步后为 (3, 2, 1)。

第 2 步后为 (3, 1, 2)。

第 3 步后为 (3, 1, 2)。

与第 2 步操作后相同,因为前两个数已经是降序了。


【评测用例规模与约定】

对于 30% 的评测用例,n, m ≤ 1000;

对于 60% 的评测用例,n, m ≤ 5000;

对于所有评测用例,1 ≤ n, m ≤ 100000,0 ≤ pi ≤ 1,1 ≤ qi ≤ n。


60分,通过6/10测评点,其余测评点超时,Java代码


import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
  public static void main(String[] args) {
  Scanner scanner = new Scanner(System.in);
  Comparator<Integer> comparator = new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
    return o2 - o1; //降序排序
    }
  };
  int n = scanner.nextInt();
  int m = scanner.nextInt();
  Integer[] num = new Integer[n];
  for (int i = 0; i < num.length; i++) {
    num[i] = i + 1;
  }
  for (int i = 0; i < m; i++) {
    int p = scanner.nextInt();
    int q = scanner.nextInt();
    if (p == 0) {
    Arrays.sort(num, 0, q, comparator);
    }else {
    Arrays.sort(num, q-1, num.length);
    }
  }
  for (Integer integer : num) {
    System.out.print(integer + " ");
  }
  }
}


满分Java代码

参考博客


import java.util.Scanner;
public class Main {
  static class pair { 
  int x, y;
  public pair(int x, int y) {
    super();
    this.x = x;
    this.y = y;
  }
  }
  public static void main(String[] args) {
  Scanner scanner = new Scanner(System.in);
  int n = scanner.nextInt();
  int m = scanner.nextInt();
  pair[] pairs= new pair[n+1];
  int top=0;
  for(int i=0;i<m;i++) { //记录有效步骤
    int p = scanner.nextInt();
    int q = scanner.nextInt();
    if(p == 1 && top > 0) {
    while(top > 0 && pairs[top].x == 1) {
      //连续出现相同的操作
      if(pairs[top].y<=q) q=pairs[top].y;
      top--;
    }
    //相邻的相同操作的范围小于当前范围
    while(top >= 2 && pairs[top-1].y >= q) {
      top -= 2;
    }
    pairs[++top] = new pair(1,q);
    }
    if(p==0){
    while(top > 0 && pairs[top].x == 0) {
      if(pairs[top].y >= q) q=pairs[top].y;
      top--;
    }
    while(top >= 2 && pairs[top-1].y <= q) top -= 2;
    pairs[++top] = new pair(0,q);      
    }
  }
  int num[] = new int[n+1];
  int k = n;
  int l = 1,r = n;
  for(int i = 1; i <= top; i++) {
    if(pairs[i].x == 0) {
    while(l <=r && pairs[i].y < r)
      num[r--] = k--;
    }
    if(pairs[i].x == 1) {
    while(l <=r && pairs[i].y > l)
      num[l++] = k--;
    }
  }
  if(top % 2 == 0) {//为操作1
    while(l <= r)
    num[r--] = k--;
  }
  else {//为操作0
    while(l <= r)
    num[l++] = k--;
  }
  for(int i = 1; i <= n; i++) {
    System.out.print(num[i] + " ");
  }
  }
}


相关文章
|
4月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
253 14
|
10月前
|
Java 程序员
Java 排序神器:Comparable 和 Comparator 该怎么选?
嗨,大家好,我是小米!今天和大家聊一聊Java社招面试中常考的经典问题——Comparable和Comparator的区别。Comparable定义对象的自然排序,适用于单一固定的排序规则;Comparator则是策略接口,用于定义自定义排序规则,适用于多样化或多变的排序需求。掌握这两者的区别是理解Java排序机制的基础,也是面试中的加分题。结合实际项目场景深入探讨它们的应用,能更好地打动面试官。如果你觉得有帮助,欢迎点赞、收藏、分享,期待你的一键三连!我们下期见~ 我是小米,一个喜欢分享技术的程序员,关注我的微信公众号“软件求生”,获取更多技术干货!
149 20
|
10月前
|
算法 搜索推荐 Java
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
本文探讨了如何将算法学习与实际项目相结合,以提升编程竞赛中的解题能力。通过《苍穹外卖》项目,介绍了订单配送路径规划(基于动态规划解决旅行商问题)和商品推荐系统(基于贪心算法)。这些实例不仅展示了算法在实际业务中的应用,还帮助读者更好地准备蓝桥杯等编程竞赛。结合具体代码实现和解析,文章详细说明了如何运用算法优化项目功能,提高解决问题的能力。
435 6
|
10月前
|
算法 Java C++
【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题
本文介绍了经典的0/1背包问题及其动态规划解法。
328 5
|
机器学习/深度学习 算法 关系型数据库
第十五届蓝桥杯C++B组省赛
第十五届蓝桥杯C++B组省赛
432 14
|
算法 C++
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
304 5
|
人工智能 Python
蓝桥杯练习题(四):Python组之历届试题三十题
关于蓝桥杯Python组历届试题的三十个练习题的总结,包括题目描述、输入输出格式、样例输入输出以及部分题目的解题思路和代码实现。
416 0
蓝桥杯练习题(四):Python组之历届试题三十题
|
存储 搜索推荐 算法
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
151 1
|
算法
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
|
人工智能 算法
蓝桥杯真题宝藏排序详解 | 冒泡排序 选择排序 插入排序
蓝桥杯真题宝藏排序详解 | 冒泡排序 选择排序 插入排序
下一篇
oss云网关配置