题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=2166 题目大意:构造一个大顶堆,并且使该堆进行对排序时交换的次数最多 题目分析:递推,每次都把1放到最底端 AC代码: #include<cstdio> #include<string> #include<cmath> #include<algorithm> using namespace std; const int MAXN = 50001; int heap[MAXN]; int main() { //freopen("input.in","r",stdin); int n; int len,i,j; while(scanf("%d",&n)!=EOF) { heap[1]=1; len=1; for(i=2;i<=n;i++) { j=len; while(j>1) { heap[j]=heap[j/2]; j/=2; } heap[1]=i; heap[++len]=1; } for(i=1;i<=n;i++) { if(i!=1) printf(" "); printf("%d",heap[i]); } printf("/n"); } return 0; }