链接:
2560. 打家劫舍 IV
题意
n个数字,相邻不能选,选择的结果为 选中的数字中的最大数字,要求最少选k个数字
求这个结果最小能是多少
解:
怎么就从DP变成二分了呢?
关键字:最大的最小
最少选k个数字,又要结果最小,那尽量少选且使选中的最大数字最小,则题目变成:选择k个数字,使<选中的数字中最大的数字>最小(选的越少,选取条件越宽松,则理论上能取的数字越小)
二分答案,Check逻辑:贪心,能选的就选上,只要满足小于等于temp_ans就先选上,选够了k个说明这个temp_ans合法
实际代码:
#include<bits/stdc++.h>
using namespace std;
bool check(vector<int>& nums,int limit, int k)
{int xz=0;for(int i=0;i<nums.size();i++){if(nums[i]<=limit){xz++;if(xz>=k) return true;i++;}}return false;
}
int minCapability(vector<int>& nums, int k)
{int l=0,r=0;for(auto num:nums) r=max(r,num);while(l<r){int mid=l+(r-l)>>1;cout<<mid<<endl;if(check(nums,mid,k)){l=mid;}else r=mid-1;}return l;
}
限制:
1 <= nums.length <= 105
1 <= nums[i] <= 109
1 <= k <= (nums.length + 1)/2