题目链接:

https://files.cnblogs.com/files/TheRoadToTheGold/2017-6.11NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B.zip

 

期望得分:100+30+100=230

实际得分:0+30+100=130

 

T1 盘子序列

数据离散化,模拟栈

将盘子大小离散化 1——n

 

指针now开始指向1,依次递增,模拟初始盘堆A最上面的盘子

用a[i]存储收到的离散化之后的第i个盘子的大小,收到盘子的顺序也看做一个栈,记为栈C

st[]模拟盘堆B, top指针指向栈顶

 

然后分4种情况讨论

1、a[i]=now 初始盘堆A的最上面的盘子直接放到了栈C  now++

2、st[i]=now 盘堆B最上面的盘子放到栈C ,top--

3、盘堆A还有盘子,盘堆AB的顶端都不等于now,一直把A的盘子往B上放,直到等于now 或A没有盘子了

4、都不符合上面3种,有危险

最后判断st即B是否是升序排列,是则没有危险,否则有危险

#include<cstdio>
#include<algorithm>
#define N 100001
using namespace std;
int n,now,x;
int st[N],top,a[N];
bool ok;
struct node
{
    int num,id;
}e[N];
bool cmp(node p,node q)
{
    return p.num<q.num;
}
int main()
{
    freopen("disk.in","r",stdin);
    freopen("disk.out","w",stdout);
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++) scanf("%d",&e[i].num),e[i].id=i;
        sort(e+1,e+n+1,cmp);
        for(int i=1;i<=n;i++) a[e[i].id]=i;
        ok=0; top=0; now=1;
        for(int i=1;i<=n;i++)
        {
            if(ok) continue;
            if(a[i]==now) now++;
            else if(top&&a[i]==st[top]) top--;
            else if(now<n&&a[i]!=now) 
            {
                while(a[i]!=now && now<n) st[++top]=now++;
                now++;
            }
            else  { printf("J\n"); ok=true;}
        }
        if(top>1&&!ok)
        {
            for(int i=1;i<top;i++) 
             if(st[i]>st[i+1])
             {
                  printf("J\n");
                 ok=true; break;
             }
        }
        if(!ok) printf("Y\n");
    }
}
View Code

相关文章:

  • 2021-11-11
  • 2021-12-06
  • 2022-02-02
  • 2021-11-27
  • 2021-11-08
  • 2021-10-11
  • 2022-02-04
  • 2021-08-09
猜你喜欢
  • 2022-02-18
  • 2021-10-10
  • 2022-01-18
  • 2021-10-24
  • 2021-12-12
  • 2021-10-05
  • 2021-10-02
相关资源
相似解决方案