http://pat.zju.edu.cn/contests/pat-a-practise/1064
将输入排序,dfs二分遍历即可。
写了好一会儿。二分搜索基础真是太差了,要多练习:(
代码:
#include <algorithm> #include <cstdio> #include <list> #include <cmath> using namespace std; const int MAX = 1005; int n, tmp, num[MAX]; list<int> level[15]; void dfs(int left, int right, int l) { if (left >= right) { return ; } int mid; int total_level = ceil( log(right-left+1) / log(2) - 0.000001); // 1 int bottom = (right-left) - pow(2, total_level-1) + 1; // if (bottom <= ceil(pow(2, total_level-1) - 0.000001) / 2) { mid = left + (ceil(pow(2,total_level-1)-0.000001)-1)/2 + bottom; } else { mid = left + (ceil(pow(2,total_level-1)-0.000001)-1)/2 + ceil(pow(2,total_level-1)-0.000001)/2; } level[l].push_back( num[mid] ); ++ l; dfs(left, mid, l); dfs(mid+1, right, l); } int main() { scanf("%d", &n); for (int i = 0; i < n; ++ i) { scanf("%d", &tmp); num[i] = tmp; } sort(num, num + n); dfs(0, n, 0); bool first = true; for (int i = 0; i < 15; ++ i) { for (auto it = level[i].begin(); it != level[i].end(); ++ it) { if (first) { printf("%d", *it); first = false; } else { printf(" %d", *it); } } } return 0; }