710.cc 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include <algorithm>
  2. #include <cstdlib>
  3. #include <ctime>
  4. #include <set>
  5. #include <vector>
  6. #include <iostream>
  7. using std::set;
  8. using std::vector;
  9. using std::sort;
  10. using std::cout; using std::endl;
  11. class Solution {
  12. private:
  13. const int N;
  14. const int MAX;
  15. vector<int>& ban;
  16. set<int> ban_set;
  17. int random() {
  18. return rand() % MAX;
  19. }
  20. int search_offset(int n) {
  21. int beg = -1, end = ban.size() - 1;
  22. while (end - beg > 1) {
  23. int mid = beg + (end - beg) / 2;
  24. if (ban.at(mid) < n) {
  25. beg = mid;
  26. } else {
  27. end = mid;
  28. }
  29. }
  30. return n < ban.at(end) ? end : end + 1;
  31. }
  32. public:
  33. Solution(int N, vector<int>& blacklist) : N(N), MAX(N - blacklist.size()), ban(blacklist), ban_set(set<int>(blacklist.begin(), blacklist.end())) {
  34. srand(time(0));
  35. sort(ban.begin(), ban.end());
  36. }
  37. int pick() {
  38. int r = random();
  39. if (N == MAX) {
  40. return r;
  41. }
  42. // Binary search candidates from 0 to N - 1
  43. int beg = 0, end = N - 1;
  44. while(beg <= end) {
  45. int mid = beg + (end - beg) / 2;
  46. // To judge candidate is available or not:
  47. // 1. Not banned; 2. Offset is correct
  48. int rr = mid - search_offset(mid);
  49. if (rr < r) {
  50. beg = mid + 1;
  51. } else if (r < rr) {
  52. end = mid - 1;
  53. } else {
  54. if (ban_set.find(mid) == ban_set.end()) {
  55. return mid;
  56. } else {
  57. end = mid - 1;
  58. }
  59. }
  60. }
  61. return -1;
  62. }
  63. };
  64. /**
  65. * Your Solution object will be instantiated and called as such:
  66. * Solution* obj = new Solution(N, blacklist);
  67. * int param_1 = obj->pick();
  68. */
  69. // 0 1 2 3
  70. // 2
  71. // 0 4 5
  72. int main() {
  73. int N = 4;
  74. vector<int> blacklist;
  75. blacklist.push_back(2);
  76. Solution* obj = new Solution(N, blacklist);
  77. int param_1 = obj->pick();
  78. int param_2 = obj->pick();
  79. int param_3 = obj->pick();
  80. cout << param_1 << ", " << param_2 << ", " << param_3 << endl;
  81. return 0;
  82. }