diff --git "a/exercises/huanhuilong/\344\270\255\347\255\211/.gitignore" "b/exercises/huanhuilong/\344\270\255\347\255\211/.gitignore" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/exercises/huanhuilong/\344\270\255\347\255\211/\346\237\245\346\211\276\347\202\271\345\234\250\350\207\252\347\204\266\345\214\272\351\227\264\347\232\204\345\235\220\346\240\207/a.out" "b/exercises/huanhuilong/\344\270\255\347\255\211/\346\237\245\346\211\276\347\202\271\345\234\250\350\207\252\347\204\266\345\214\272\351\227\264\347\232\204\345\235\220\346\240\207/a.out" new file mode 100755 index 0000000000000000000000000000000000000000..b9cd32ff87a659d9553ad918aebeefb83fb164ee Binary files /dev/null and "b/exercises/huanhuilong/\344\270\255\347\255\211/\346\237\245\346\211\276\347\202\271\345\234\250\350\207\252\347\204\266\345\214\272\351\227\264\347\232\204\345\235\220\346\240\207/a.out" differ diff --git "a/exercises/huanhuilong/\344\270\255\347\255\211/\346\237\245\346\211\276\347\202\271\345\234\250\350\207\252\347\204\266\345\214\272\351\227\264\347\232\204\345\235\220\346\240\207/exercises.md" "b/exercises/huanhuilong/\344\270\255\347\255\211/\346\237\245\346\211\276\347\202\271\345\234\250\350\207\252\347\204\266\345\214\272\351\227\264\347\232\204\345\235\220\346\240\207/exercises.md" new file mode 100644 index 0000000000000000000000000000000000000000..45438e2fafa40f98f27119638a8000d9be1bc725 --- /dev/null +++ "b/exercises/huanhuilong/\344\270\255\347\255\211/\346\237\245\346\211\276\347\202\271\345\234\250\350\207\252\347\204\266\345\214\272\351\227\264\347\232\204\345\235\220\346\240\207/exercises.md" @@ -0,0 +1,33 @@ +# 查找点在自然区间的坐标 + +定义: + +* 实数轴上的一个区间由左右两个端点,假设区间是左闭右开的,例如区间`[0,1)` +* 给定一个有序的不重合非负整数区间列表 range_list :[ `[0,1)`, `[3,4)` ] +* 该非负整数区间列表将实数轴分割成了这些区间列表 range_list_nature_ext : [`(-∞,0)`,`[0,1)`,`[1,3)`,`[3,4)`,`[4,+∞)`] +* 我们称 range_list_nature_ext 为由 range_list 扩展的 `自然区间` + +问题:写一个查找算法,对于给定非负整数区间列表 range_list ,查找一个非负整数 p 落在了 range_list_nature_ext 的那个区间,返回那个区间的在 range_list_nature_ext 里的下标,我们称这个下标为非负整数 p 在 rage_list 里的 `自然坐标`。 + +## 输入描述 + +第一行输入要查找的非负整数 p,以及区间列表个数 N,用空格分开 +第二行到第N+1行输入非负整数区间列表的每个区间,这些区间列表不重叠,按在实数轴上从左到右的顺序挨个输入,区间的两个坐标用空格分开 + +## 输出描述 + +输出一行,包含非负整数 p 的自然坐标 + +## 输入样例 + +12 2 +0 10 +15 20 + +## 输出样例 + +2 + +## 提示 + +无 diff --git "a/exercises/huanhuilong/\344\270\255\347\255\211/\346\237\245\346\211\276\347\202\271\345\234\250\350\207\252\347\204\266\345\214\272\351\227\264\347\232\204\345\235\220\346\240\207/solution.cpp" "b/exercises/huanhuilong/\344\270\255\347\255\211/\346\237\245\346\211\276\347\202\271\345\234\250\350\207\252\347\204\266\345\214\272\351\227\264\347\232\204\345\235\220\346\240\207/solution.cpp" new file mode 100644 index 0000000000000000000000000000000000000000..0159b0967a245fec852757f3458680b9f93448e2 --- /dev/null +++ "b/exercises/huanhuilong/\344\270\255\347\255\211/\346\237\245\346\211\276\347\202\271\345\234\250\350\207\252\347\204\266\345\214\272\351\227\264\347\232\204\345\235\220\346\240\207/solution.cpp" @@ -0,0 +1,150 @@ +#include +#include +#include +#include +#include +#include + +class Range +{ +public: + Range():m_pos(0), m_length(0){}; + + Range(uint64_t pos, uint64_t length): m_pos(pos), m_length(length){} + + Range(Range const & rhs){ + if (this == &rhs) + return; + m_pos = rhs.m_pos; + m_length = rhs.m_length; + } + Range& operator = (Range const & rhs){ + if (this == &rhs) + return *this; + m_pos = rhs.m_pos; + m_length = rhs.m_length; + return *this; + } + + ~Range(){} + + bool operator<(Range const & rhs) const{ + return m_pos < rhs.m_pos || (m_pos == rhs.m_pos && m_length < rhs.m_length); + } + + uint64_t GetPos() const { + return m_pos; + } + + uint64_t GetLength() const{ + return m_length; + } + + uint64_t GetRight() const{ + return m_pos+m_length; + } + +public: + uint64_t m_pos; + uint64_t m_length; +}; + +size_t findNatureRangeIndex(std::vector& rangeList, uint64_t point){ + size_t n = rangeList.size(); + size_t first = 0; + size_t last = 2 * n + 1; + size_t max = last; + + uint64_t testBeg = 0; + uint64_t testEnd = 0; + size_t idx = SIZE_MAX; + while (first <= last) { + size_t mid = (first + last) / 2; // compute mid point. + std::cout<<"xx:"<= max - 1) { + uint64_t lastEnd = rangeList[n - 1].m_pos + rangeList[n - 1].m_length; + std::cout<<"point:"<=lastEnd) { + idx = max - 1; + } else { + idx = max - 2; + } + break; + } + + // 处理左边界 + if (mid == 0) { + if (point >= rangeList[0].m_pos) { + idx = 1; + } else { + idx = 0; + } + break; + } + + // 处理中间 + bool even = mid % 2 == 0; + if (even) { + size_t left = (mid - 1) / 2; + size_t right = left + 1; + testBeg = rangeList[left].m_pos + rangeList[left].m_length; + testEnd = rangeList[right].m_pos; + } else { + size_t current = mid / 2; + testBeg = rangeList[current].m_pos; + testEnd = rangeList[current].m_pos + rangeList[current].m_length; + } + + // 二分查找 + + if (point>=testEnd) { + std::cout<<"->"< inputs; + + // 输入点,区间个数 + std::cin>>p; + std::cin>>N; + + // 收集区间点 + for(int i=0;i>l; + std::cin>>r; + inputs.push_back(l); + inputs.push_back(r); + } + + // 转换区间 + std::vector rangeList; + for(int i=0;i