2017 6 11模拟赛

Posted Soda

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017 6 11模拟赛相关的知识,希望对你有一定的参考价值。

盘子序列

【题目描述】

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

【数据范围】

20%的数据保证 n<=8

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

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

模拟,考试的时候想着双栈排序那道题,就考虑到,当且仅当i<j<k&&a[j]<a[k]<a[i]是不能用单栈排序(i位于三者最底层),好像和这个题是同样的道理,所以就这么写出来了,没多想,考完顿悟了,这个做法复杂度O(n^2),还不如开个栈模拟

 

/*考完试一气之下写的这个丑代码我也不想说什么了,感觉像在乱搞*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 100010
int n,top1,top2,top3;
struct node{
    int num,rank,id;
}a[maxn],b[maxn];
int cmp1(node x,node y){
    return x.num>y.num;
}
int cmp2(node x,node y){
    return x.id<y.id;
}
int main(){
    freopen("disk.in","r",stdin);
    freopen("disk.out","w",stdout);
    while(scanf("%d",&n)!=EOF){
        bool flag=0;
        memset(a,0,sizeof(a));top1=0;top2=0;top3=1;
        for(int i=1;i<=n;i++)scanf("%d",&a[++top1].num),a[top1].id=i;
        sort(a+1,a+n+1,cmp1);
        for(int i=1;i<=n;i++)a[i].rank=i;
        sort(a+1,a+n+1,cmp2);
        while(top1>=1){
            int t1=top1,t2=top2,t3=top3;
            while(top2!=0&&b[top2].rank==top3){
                top3++;top2--;
            }
            if(a[top1].rank==top3){
                top3++;top1--;
            }
            else{
                while(a[top1].rank!=top3&&b[top2].rank!=top3){
                    if(top1<=0){
                        flag=1;break;
                    }
                    b[++top2]=a[top1--];
                }
            }
            if(t1==top1&&t2==top2&&t3==top3){
                break;
            }
            if(flag==1)break;
        }
        while(top2!=0&&b[top2].rank==top3){
                top3++;top2--;
        }
        if(flag==1)printf("J\n");
        else if(top3!=n+1){
            printf("J\n");
        }
        else printf("Y\n");
    }
}

 

以上是关于2017 6 11模拟赛的主要内容,如果未能解决你的问题,请参考以下文章

2017 6 11模拟赛

2017 11 6模拟赛T1

NOIP2017赛前模拟11月6日—7日总结

当我想模拟数据并测试 UI 片段时,doNothing() 不起作用

[OI模拟赛]2017.8.24 Day5

VSCode自定义代码片段6——CSS选择器