#152. 盘子序列

【题目描述】:

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

【输入描述】:

输入包含多组数据(不超过 10 组)

每组数据的第一行为一个整数 n

接下来n 个整数,第 i 个整数表示你收到的第 i 个盘子的大小

【输出描述】:

对于每组数据,如果存在危险的盘子,输出”J”,否则输出”Y”

【样例输入】:

3
2 1 3
3
3 1 2

【样例输出】:

Y
J

【时间限制、数据范围及描述】:

时间:1s 空间:128M

20%的数据保证 n<=8

80%的数据保证 n<=1,000

100%的数据保证 1<=n<=100,000,0<盘子大小<1,000,000,000 且互不相等

【AC代码】:

#include<bits/stdc++.h>
#define M(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define Mod 100003
using namespace std;
inline void read(int &x){
    char ch=getchar(),c=ch;
	x=0;
    while(ch<'0' || ch>'9'){
    	 c=ch;
		 ch=getchar();
	}
    while(ch>='0' && ch<='9'){
    	x=(x<<1)+(x<<3)+ch-'0';
		ch=getchar();
	}
    if(c=='-')x=-x;
}


int a[100005],b[100005],c[100005];
int n,i,falg,top;

int main(){
    while(scanf("%d",&n)!=EOF){
        falg=top=0;
        for(i=1;i<=n;i++)read(a[i]);
        for(i=1;i<=n;i++)c[i]=a[i];
        sort(a+1,a+1+n);
        int p1,p2=1;
        for(p1=1;p1<=n;p1++){
            if(a[p1]==c[p2]){
                p2++;continue;
            }
            if(a[p1]<c[p2])b[++top]=p1;
            else{
                for(;top>0;){
                    if(b[top]==c[p2]){
                        top--;p2++;
                    }
                    else break;
                }
                if(a[p1]!=c[p2])b[++top]=a[p1];
                else p2++;
            }
        }
        while(top){
            if(b[top]!=c[p2]){
                falg=1;break;
            }
            else top--;p2++;
        }
        if(falg)printf("J\n");
        else printf("Y\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值