diff --git a/pom.xml b/pom.xml
index 50302a9..31bbdca 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,5 +20,17 @@
4.4
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 21
+ 21
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/dota/binarySearch/_1011/Solution.java b/src/main/java/com/dota/binarySearch/_1011/Solution.java
new file mode 100644
index 0000000..906f191
--- /dev/null
+++ b/src/main/java/com/dota/binarySearch/_1011/Solution.java
@@ -0,0 +1,33 @@
+package com.dota.binarySearch._1011;
+
+class Solution {
+ public int shipWithinDays(int[] weights, int days) {
+ int l = weights[0];
+ for (int weight : weights) {
+ l = Math.max(l, weight);
+ }
+ int r = l * weights.length;
+ while (l < r) {
+ int mid = (l + r) / 2;
+ if (df(weights, mid) <= days) {
+ r = mid;
+ } else {
+ l = mid + 1;
+ }
+ }
+
+ return r;
+ }
+ int df(int[] nums, int weight) {
+ int res = 1;
+ int temp = 0;
+ for (int num : nums) {
+ temp += num;
+ if (temp > weight) {
+ res++;
+ temp = num;
+ }
+ }
+ return res;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/dota/binarySearch/_1283/Solution.java b/src/main/java/com/dota/binarySearch/_1283/Solution.java
new file mode 100644
index 0000000..c47af61
--- /dev/null
+++ b/src/main/java/com/dota/binarySearch/_1283/Solution.java
@@ -0,0 +1,27 @@
+package com.dota.binarySearch._1283;
+
+class Solution {
+ public int smallestDivisor(int[] nums, int threshold) {
+ int l = 1;
+ int r = 1000000;
+ while (l < r) {
+ int mid = l + (r - l) / 2;
+ int t = df(nums, mid);
+ if (t <= threshold) {
+ r = mid;
+ } else {
+ l = mid + 1;
+ }
+ }
+
+ return df(nums, r);
+ }
+
+ int df(int[] nums, int t) {
+ int res =0;
+ for (int num : nums) {
+ res += (num + t - 1) / t;
+ }
+ return res;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/dota/binarySearch/_2187/Solution.java b/src/main/java/com/dota/binarySearch/_2187/Solution.java
new file mode 100644
index 0000000..6b7c44c
--- /dev/null
+++ b/src/main/java/com/dota/binarySearch/_2187/Solution.java
@@ -0,0 +1,33 @@
+package com.dota.binarySearch._2187;
+
+import java.util.ArrayList;
+import java.util.List;
+
+class Solution {
+ public long minimumTime(int[] time, int totalTrips) {
+ long r = time[0];
+ for (int i : time) {
+ r = Math.min(r, i);
+ }
+ r = r * totalTrips;
+ long l = 1;
+ while (l < r) {
+ long mid = l + (r - l) / 2;
+ if (df(time, mid) >= totalTrips) {
+ r = mid;
+ } else {
+ l = mid+1;
+ }
+ }
+
+ return r;
+ }
+
+ long df(int[] nums, long t) {
+ long res = 0;
+ for (int num : nums) {
+ res += t/num;
+ }
+ return res;
+ }
+}
diff --git a/src/main/java/com/dota/binarySearch/_3508/Router.java b/src/main/java/com/dota/binarySearch/_3508/Router.java
new file mode 100644
index 0000000..07b8078
--- /dev/null
+++ b/src/main/java/com/dota/binarySearch/_3508/Router.java
@@ -0,0 +1,85 @@
+package com.dota.binarySearch._3508;
+
+
+import java.util.*;
+
+record Node(
+ int s,
+ int d,
+ int t) {
+}
+
+class Router {
+ List list;
+ Set nodeSet;
+ Map> sortMap;
+ int cnt;
+ int limit;
+
+ public Router(int memoryLimit) {
+ list = new ArrayList<>();
+ this.limit = memoryLimit;
+ nodeSet = new HashSet<>();
+ this.cnt = 0;
+ sortMap = new HashMap<>();
+ }
+
+ public boolean addPacket(int source, int destination, int timestamp) {
+ var n = new Node(source, destination, timestamp);
+ if (nodeSet.contains(n)) {
+ return false;
+ }
+
+ cnt++;
+ list.add(n);
+ nodeSet.add(n);
+ sortMap.computeIfAbsent(destination, k -> new ArrayList<>()).add(timestamp);
+ if (cnt > limit) {
+ cnt--;
+ n = list.removeFirst();
+ nodeSet.remove(n);
+ sortMap.get(n.d()).removeFirst();
+ }
+ return true;
+ }
+
+ public int[] forwardPacket() {
+ if (cnt == 0) return new int[]{};
+ cnt--;
+ var n = list.removeFirst();
+ nodeSet.remove(n);
+ sortMap.get(n.d()).removeFirst();
+ return new int[]{n.s(), n.d(), n.t()};
+ }
+
+ public int getCount(int destination, int startTime, int endTime) {
+ var li = sortMap.get(destination);
+ if (li == null) return 0;
+ var r = find(li, endTime + 1);
+ var l = find(li, startTime);
+ return r-l;
+ }
+
+ int find(List list, int target) {
+ int l = 0, r = list.size();
+ while (l < r) {
+ int mid = l + (r - l) / 2;
+ if (list.get(mid) >= target) {
+ r = mid;
+ } else {
+ l = mid + 1;
+ }
+ }
+ return r;
+ }
+
+ public static void main(String[] args) {
+ var r = new Router(2);
+ r.addPacket(1,4,1);
+ r.addPacket(5,4,1);
+ r.addPacket(1,4,1);
+ r.getCount(4,1,1);
+ r.forwardPacket();
+ r.getCount(4,1,1);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/dota/binarySearch/_875/Solution.java b/src/main/java/com/dota/binarySearch/_875/Solution.java
new file mode 100644
index 0000000..d8031b3
--- /dev/null
+++ b/src/main/java/com/dota/binarySearch/_875/Solution.java
@@ -0,0 +1,29 @@
+package com.dota.binarySearch._875;
+
+class Solution {
+ public int minEatingSpeed(int[] piles, int h) {
+ int l = 0;
+ int r = piles[0];
+ for (int pile : piles) {
+ r = Math.max(r, pile);
+ }
+
+ while (l < r) {
+ int mid = l + (r - l) / 2;
+ if (df(piles, mid) > h) {
+ l = mid + 1;
+ } else {
+ r = mid;
+ }
+ }
+ return l;
+ }
+
+ int df(int[] piles, int k) {
+ int res = 0;
+ for (int pile : piles) {
+ res += (pile + k - 1) / k;
+ }
+ return res;
+ }
+}
\ No newline at end of file