1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include <iostream> #include <vector> #define lowbit(x) ((x) & (-x)) using namespace std; const int N = 1025; int c[N] = {0}; void add(int x, int v) { for (int i = x; i < N; i += lowbit(i)) c[i] += v; } int getSum(int x) { if (x < 1) return 0; else return c[x] + getSum(x - lowbit(x)); } int getKthLeast(int k) { int left = 1, right = N - 1, mid; while (left < right) { mid = (left + right) / 2; if (getSum(mid) >= k) right = mid; else left = mid + 1; } return left; } int main() { int n, k, temp, cnt = 0; while (true) { while (cin >> temp, temp != -1) { add(temp, 1); } printf("Input the k to search: "); scanf("%d", &k); if (k != -1) { printf("The k-th least number is %d\n", getKthLeast(k)); break; } else continue; } return 0; }
|