[关闭]
@ysner 2018-06-07T17:25:39.000000Z 字数 2270 阅读 1905

盘子序列

模拟


题面

个盘子。盘子被生产出来后,被按照某种顺序摞在一起。初始盘堆中如
果一个盘子比所有它上面的盘子都大,那么它是安全的,否则它是危险的。称初
始盘堆为,另外有一个开始为空的盘堆。为了掩盖失误,生产商会对盘子序
列做一些“处理”,每次进行以下操作中的一个:

在得到所有个盘子之后,你需要判断初始盘堆里是否有危险的盘子。

解析

如果初始盘堆真的合法,会怎么样?
最后出来的序列,肯定是一个倒序结构,如之类。
或者说,如果在把弄到盘后,先取出,最后会形成
即你每取出一段时,这一段肯定是倒序的。
如果不是倒序,则开始了新的一段。
在初始盘堆中,新的一段在先前一段的下面或者还可以跨过了先前一段向上
则新一段数中,

然后我因考场上没想清楚,漏了第一点。。。
注意防止自己设的变量初始值成为有效限制条件(如)
此想法已弃坑,因难以保证正确性

  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<cstdlib>
  6. #include<algorithm>
  7. #define ll long long
  8. #define re register
  9. #define il inline
  10. #define fp(i,a,b) for(re int i=a;i<=b;i++)
  11. #define fq(i,a,b) for(re int i=a;i>=b;i--)
  12. using namespace std;
  13. const int N=2e5+100;
  14. int n,a[N],mx,mn,lasmx;
  15. int main()
  16. {
  17. freopen("disk.in","r",stdin);
  18. freopen("disk.out","w",stdout);
  19. while(scanf("%d",&n)!=EOF)
  20. {
  21. re int flag=1;
  22. fp(i,1,n) a[i]=gi();mx=a[1];mn=1e9;
  23. fp(i,2,n)
  24. {
  25. if(!flag) break;
  26. if(a[i]>a[i-1])
  27. {
  28. if(a[i-1]<lasmx&&a[i-1]>mn) flag=0;
  29. else mn=a[i-1];
  30. if(a[i]<mx) flag=0;
  31. else lasmx=mx,mx=a[i];
  32. }
  33. }
  34. puts(flag?"Y":"J");
  35. }
  36. fclose(stdin);
  37. fclose(stdout);
  38. return 0;
  39. }

据说这是一道栈的入门题???WC
先开一个合法初始队列栈
看你现在要弹出哪个数,若比栈顶数大就把栈的数弹进来,若比栈顶数小就弹数直到找到那个数为止。然后弹出那个数即可。
弹不出就不合法。

  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<cstdlib>
  6. #include<algorithm>
  7. #define ll long long
  8. #define re register
  9. #define il inline
  10. #define fp(i,a,b) for(re int i=a;i<=b;i++)
  11. #define fq(i,a,b) for(re int i=a;i>=b;i--)
  12. using namespace std;
  13. const int N=2e5+100;
  14. int n,a[N],b[N],sta[N],stb[N],topa,topb,mx,mn,lasmx;
  15. il ll gi()
  16. {
  17. re ll x=0,t=1;
  18. re char ch=getchar();
  19. while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
  20. if(ch=='-') t=-1,ch=getchar();
  21. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  22. return x*t;
  23. }
  24. il void wri(re int x)
  25. {
  26. if(x<0) putchar('-'),x=-x;
  27. if(x>9) wri(x/10);
  28. putchar(x%10+'0');
  29. }
  30. int main()
  31. {
  32. freopen("a.in","r",stdin);
  33. freopen("a.out","w",stdout);
  34. while(scanf("%d",&n)!=EOF)
  35. {
  36. re int len,flag=1;
  37. fp(i,1,n) a[i]=b[i]=gi();
  38. sort(b+1,b+1+n);
  39. len=unique(b+1,b+1+n)-b-1;
  40. fp(i,1,n) a[i]=lower_bound(b+1,b+1+len,a[i])-b;
  41. fp(i,1,n) sta[i]=n-i+1;topa=n;topb=0;
  42. fp(i,1,n)
  43. {
  44. while(stb[topb]<a[i]&&topa) stb[++topb]=sta[topa--];
  45. while(stb[topb]>a[i]&&topb) --topb;
  46. if(stb[topb]^a[i]||!topb) {flag=0;break;}else --topb;
  47. }
  48. puts(flag?"Y":"J");
  49. }
  50. fclose(stdin);
  51. fclose(stdout);
  52. return 0;
  53. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注