前言
这道题考场上又搞错了,其实很简单。
题目描述
有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";
}
}