时间限制 1000 ms 内存限制 65536 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
分析:
题目大意:给出n和n个数的序列a和b,a为原始序列,b为排序其中的一个步骤,问b是a经过了堆排序还是插入排序的,并且输出它的下一步~
参考:1098. Insertion or Heap Sort (25)-PAT甲级真题(堆排序)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #define ll long long const int inf=0x3f3f3f3f; using namespace std; int n; int Sp[106],Sort1[106],Sort2[106]; int f=0; void BFS(int x,int N)///一趟排序 { if(2*x>N) return ; else if(2*x==N){///不向下递归 if(Sort1[x]<Sort1[2*x]) { swap(Sort1[x],Sort1[2*x]); f=1; } } else{ f=1; if(Sort1[2*x]>Sort1[x] && Sort1[2*x]>Sort1[2*x+1]){ swap(Sort1[2*x],Sort1[x]); BFS(2*x,N); }else if(Sort1[2*x+1]>Sort1[x] && Sort1[2*x+1]>Sort1[2*x]){ swap(Sort1[2*x+1],Sort1[x]); BFS(2*x+1,N); } } } void Sort_Heap()///模拟堆排序 { for(int i=1;i<=n;i++) Sort2[i]=Sort1[i]; for(int i=1;i<=n;i++) Sort1[i]=Sp[i]; for(int i=n;i>=1;i--){///n次 for(int j=i;j>=1;j--){ BFS(j,i); } int ff=0; for(int j=i+1;j<=n;j++){ if(Sort1[j]!=Sort2[j]){ ff=1; break; } } if(ff) break; swap(Sort1[1],Sort1[i]); } cout<<Sort1[1]; for(int ii=2;ii<=n;ii++) cout<<" "<<Sort1[ii]; cout<<endl; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); cin>>n; for(int i=1;i<=n;i++) cin>>Sp[i]; for(int i=1;i<=n;i++) cin>>Sort1[i]; int i; for(i=2;i<=n;i++){ if(Sort1[i]>Sort1[i-1]) continue; break; } int f=0,t=i; for(;i<=n;i++){ if(Sort1[i]!=Sp[i]){ f=1; break; } } if(f==0){ cout<<"Insertion Sort"<<endl; sort(Sort1+1,Sort1+1+t);///µÚt¸ö²åÈë cout<<Sort1[1]; for(int i=2;i<=n;i++) cout<<" "<<Sort1[i]; }else{ cout<<"Heap Sort"<<endl; Sort_Heap(); } return 0; }