disk 盘子序列

2 篇文章 0 订阅
1 篇文章 0 订阅
前言

这道题考场上又搞错了,其实很简单。

题目描述

有n个盘子。盘子被生产出来后,被按照某种顺序摞在一起。初始盘堆中如果一个盘子比所有它上面的盘子都大,那么它是安全的,否则它是危险的。称初始盘堆为A,另外有一个开始为空的盘堆B。为了掩盖失误,生产商会对盘子序列做一些“处理”,每次进行以下操作中的一个:(1)将A最上面的盘子放到B最上面;(2)将B最上面的盘子给你。在得到所有n个盘子之后,你需要判断初始盘堆里是否有危险的盘子。

solution

直接模拟就好了 qwq q w q (注意离散化)

代码

#include<bits/stdc++.h>
using namespace std;
const int _ =100011;
int a[_],b[_];
int n;
struct zjy{
    int num;
    int data;
}mm[_];
bool cmp(zjy k,zjy l){
    return k.data<l.data;
}
bool cmp2(zjy k,zjy l){
    return k.num<l.num;
}
int main(){
    freopen("disk.in","r",stdin);
    freopen("disk.out","w",stdout);
    ios::sync_with_stdio(false);
    while(cin>>n){
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        for(register int i=1;i<=n;++i){
            cin>>mm[i].data;
            mm[i].num=i;
        }
        sort(mm+1,mm+n+1,cmp);
        for(register int i=1;i<=n;++i){
            mm[i].data=i;
        }
        sort(mm+1,mm+n+1,cmp2);
        for(register int i=1;i<=n;++i){
            a[i]=mm[i].data;
        }
        register int top1=n,top2=0;
        register int ju=n+1;
        for(;top1;--top1){
            if(b[top2]==ju-1){
                ju=b[top2];
                top1++;
                top2--;
                continue;
            }
            else {
                if(a[top1]==ju-1){
                    ju=a[top1];
                    continue;
                }
                b[++top2]=a[top1];
            }
        }
        bool flag=0;
        for(register int i=top2;i;--i){
            if(b[i]!=ju-1){cout<<"J\n";flag=1;break;}
            else ju=b[i];
        }
        if(flag==0)cout<<"Y\n";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值