T3-Minimized Maximum of Products Distributed to Any Store
IDEA
- 划分解空间(和前一个博客的题目类似)
- 二分法求解
- 令k:每个商店的分配数量小于等于k是否有可能。
- 则k的下界:所有quantities加起来,对商店的均值
- 则k的上界: quantities中的最大值。
- 所以,对于[下界,上界]区间进行二分查找。注意二分查找的细节。
class Solution {
//判断每个商店的数量<=k是否有可能
public boolean judge(int k,int[] quantities,int n)
{
int ret = 0;
for(int i = 0;i<quantities.length;i++)
{
ret += (int)Math.ceil((double)quantities[i] / k);
if(ret > n)
return false;
}
return true;
}
public int minimizedMaximum(int n, int[] quantities) {
//在区间[floor(quantities / n),max(quantities)]进行二分
int avg = 0;
int max = Integer.MIN_VALUE;
for(int i : quantities)
{
max = Math.max(max,i); //求最大值
avg+=i;
}
avg =(int)Math.floor((double)avg / n);
//二分区间为[avg,max]
int low = avg;
int high = max;
while(low <= high)
{
int mid = (low + high) / 2;
if(!judge(mid, quantities, n))
{
low = mid + 1;
}
else high = mid - 1;
}
return low;
}
}
- 仔细斟酌,这里退出之后low是答案
T4:Maximum Path Quality of a Graph
- 使用DFS
- visit数组的用法需要更改
- 当初次进入即visit对应值为0时加上该结点的价值
- 退栈时visit对应的值减1
class Solution {
long ret = 0;
public void DFS(int i,int j,Map<Integer,List<int[]>> adjmap,int[] values,int[] visit,long cur_val)
{
if(j < 0)
return;
if(visit[i] == 0) { //每个结点至多被访问一次
cur_val += values[i];
}
visit[i] ++; //标记当前结点正在被访问
if(i == 0)
ret = Math.max(ret,cur_val);
for(int[] edges:adjmap.get(i))
{
DFS(edges[0],j - edges[1],adjmap,values,visit,cur_val);
}
visit[i]--;
}
public int maximalPathQuality(int[] values, int[][] edges, int maxTime)
{
Map<Integer,List<int[]>> adjmap = new HashMap<>();
for(int i = 0;i<values.length;i++)
adjmap.put(i,new ArrayList<>());
for(int i = 0;i<edges.length;i++)
{
adjmap.get(edges[i][0]).add(new int[]{edges[i][1],edges[i][2]});
adjmap.get(edges[i][1]).add(new int[]{edges[i][0],edges[i][2]});
}
int[] visit = new int[values.length];
DFS(0,maxTime,adjmap,values,visit,0);
return (int)ret;
}
}