题目链接:
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"); } }