基本题意:
原本有1、2、3、4 ..........n个按顺序排列的点,现需要通过一个中转站(堆)把原序列重新排列成
a1, a2, ..., aN,问是否能实现。
思路:思路十分明显,只需要用堆模拟排列过程即可,(这个过程可以直接用stack来实现,我用的数组模拟完全出于习惯)。
易错点:1.本题格式要求比较严格,(我开始因为没空行wa了两次)。
2. 虽然本题没有给出每个样例具体有几行输入,但是可以通过判断是否有0来判断结束,不需要通过字符串存储,这样可以简化一下程序。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
typedef long long LL;
int main(){
int n,fl=0;
while(cin>>n){
if(n==0){//判断是否结束
break;
}
else if(fl!=0&&n!=0){//第一个样例前面不需要输出空行
puts("");
}
else fl=1;
int mb[2010];
while(1){
for(int i=1;i<=n;i++){
cin>>mb[i];
if(mb[i]==0) break;
}
if(mb[1]==0){
break; //判断是否结束
}
int dui[1010];//模拟堆
int tt=-1,flag=1;
for(int i=1;i<=n;i++){
dui[++tt]=i;//每次在末尾加入元素
while(dui[tt]==mb[flag]&&flag<=n&&tt>=0){//相同则取出堆顶元素
tt--;
flag++;
}
}
if(flag==n+1) puts("Yes");
else puts("No");
}
}
return 0;
}