LCP 18. 早餐组合
class Solution {
public:
int bfind(int x, vector<int>& v) {
if (v[v.size() - 1] <= x) return v.size();
long start = 0, end = v.size() - 1, mid;
while (start <= end) {
mid = (start + end) / 2;
if (v[mid] > x) {
if (mid - 1 >= 0 && v[mid - 1] <= x) return mid;
else end = mid - 1;
}
else if (v[mid] == x) {
while (mid + 1 < v.size()) {
if (v[mid + 1] == x) {
mid++;
}
else {
break;
}
}
return mid + 1;
}
else if (v[mid] < x) {
if (mid + 1 < v.size() && v[mid + 1] > x) return mid+1;
else start = mid + 1;
}
}
return 0;
}
int breakfastNumber(vector<int>& staple, vector<int>& drinks, int x) {
sort(staple.begin(), staple.end(), less<int>());
sort(drinks.begin(), drinks.end(), less<int>());
int index = 0;
int ans = 0;
while (index < staple.size()) {
if (staple[index] >= x) break;
int num = bfind(x - staple[index], drinks);
ans += (num % (int)(1e9 + 7));
index++;
}
return ans % (int)(1e9 + 7);
}
};