蓝桥杯 双向排列(Java)

 

这题我看了两个博主的文章可算把它看懂了,链接如下:

蓝桥杯 I.双向排序_Jozky86的博客-CSDN博客_蓝桥杯双向排序

蓝桥杯2021年第十二届省赛-双向排序_zy98zy998的博客-CSDN博客_蓝桥杯双向排序

我的代码如下:

import java.util.*;
class Main{
	public static class pair{
		int x=0;
		int y=0;
		pair(int a,int b) {
			x=a;
			y=b;
		}
	}
	public static void main(String args[]) {
		int n,m;
		Scanner scan=new Scanner(System.in);
		n=scan.nextInt();
		m=scan.nextInt();
		pair[] pairs= new pair[n+1];
		int top=0;
		int item[]=new int[n+1];
//		for(int i=1;i<=n;i++) {
//			item[i]=i;
//		}
		int p,q;
		for(int i=0;i<m;i++) {//记录有效步骤
			p=scan.nextInt();
			q=scan.nextInt();
//			System.out.println("第"+i+"次输入操作: "+"p: "+p+"  q: "+q);
			if(p==1&&top>0) {//top大于0是为了保证第一次操作为 0操作
				while(top>0&&pairs[top].x==1) {//top记录上一个操作
					//若连续出现相同的操作,取范围大的那个
					if(pairs[top].y<=q) 
						q=pairs[top].y;
					--top;//将上一个操作的q赋值给当前的q,并将top移动至上一个操作的上一步
				}
				//若相邻的相同操作的范围小于当前范围,则top更新,舍弃小范围
				while(top>=2&&pairs[top-1].y>=q) {
					top-=2;//删除一组操作(即0操作和1操作)
				}
				pairs[++top]=new pair(1,q);//top始终停留在要记录操作的前一步
//				System.out.println("top: "+top+"  操作1  x: "+pairs[top].x+"  y: "+pairs[top].y);
				}
			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);      
//				System.out.println("top:  "+top+"  操作0  x: "+pairs[top].x+"  y: "+pairs[top].y);
				}
		}
		
		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)
					item[r--]=k--;
			}
			if(pairs[i].x==1) {
				while(l<=r&&pairs[i].y>l)
					item[l++]=k--;
			}
		}
		if(top%2==0) {//为操作1
			while(l<=r)
				item[r--]=k--;
		}
		else {//为操作0
			while(l<=r)
				item[l++]=k--;
		}
		for(int i=1;i<=n;i++) {
			System.out.print(item[i]+" ");
		}
	}
}

收获 

(1)自己不动手敲一遍永远不知道别人的代码有多精妙。

          top=0 :可以保证第一次的操作一定是“操作0” ,一旦 top不等于0 就说明已经存储了有效步骤操作0 ,那么就可以存储 操作1 了。

          在第一个while循环中,if条件中要取等号,因为最后一定进行存储操作的步骤,所以第一个while循环只是让q取有效值,所以不管q的值是否改变,都要 --top。

          在第二个while循环中,循环条件也要取等号,若不加等号,就会存储两次相同的操作值q。

          通过 top%2 来判断是哪个操作。因为top=1时一定是操作0,所以若余数为0,必为操作1。

(2)对象数组的有效创建。

         pair[] pairs=new pair[n] 只是干了这么一件事,pair pairs[1], pair pairs[2]......

         只进行了声明并未实例化。所以在存入有效操作时还要new。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值