二分法思想很简单,举个例子。
0--100 random一个数字num
让你猜这个数字是多少?
第一步肯定先猜50~,这就是二分的思想。好了,到此为止,你已经学会了二分法,接下来让我们做到题练习一下。
思路:
1,遍历时间:从min(1) ~ max(rank[i] * cars * cars)
2, 时间肯定超了,那就用二分法,一半一半猜~
show show code
bool check(long long time,int *ranks, int ranksSize,int cars)
{
long long m = 0;
for(int i = 0;i<ranksSize;i++)
{
m += sqrt(time/ranks[i]);
}
return m >= cars;
}
typedef long long ll;
long long repairCars(int* ranks, int ranksSize, int cars){
long long res = 0;
long long left = 1, right = 1ll * ranks[0] * cars * cars;
while(left < right)
{
long long mid = (left + right)>>1;
if(check(mid,ranks,ranksSize,cars))
{
right = mid;
}else{
left = mid+1;
}
}
return left;
}
bool get(long long budget,int num,int* comp,int *stock,int stockSize,int* cost,int costSize)
{
for(int i = 0;i<stockSize;i++)
{
long long temp = 1ll*(1ll*num*comp[i] - stock[i]);
if(temp > 0)
{
budget -= (long long)temp*cost[i];
}
}
return budget >= 0;
}
int money(int n ,long long budget, int* comp,int *stock,int stockSize,int* cost,int costSize)
{
int right = (budget/cost[0] + stock[0])/comp[0];
int left = 0;
while(left < right)
{
int mid = left + (right-left)/2;
if(get(budget,mid,comp,stock,stockSize,cost,costSize))
{
left = mid + 1;
}else
{
right = mid - 1;
}
}
if(get(budget,left,comp,stock,stockSize,cost,costSize))
{
return left;
}
return left-1;
}
int maxNumberOfAlloys(int n, int k, int budget, int** composition, int compositionSize, int* compositionColSize, int* stock, int stockSize, int* cost, int costSize){
int res = 0;
for(int i = 0;i<compositionSize;i++)
{
res = fmax(res,money(n,(long long)budget,composition[i],stock,stockSize,cost,costSize));
}
return res;
}