刷题 二分

2023.12.6 cf1902B

二分

一般来讲我们会在以下情况用到二分:

  • 求单调函数的零点
  • 求最小值的最大,或最大值的最小
  • 很难直接算出答案,但是很好判定答案合不合法

二分答案和二分查找差不多,就是check函数内是贪心dp之类的东西

当用二分控制精度时,以r-l>eps为循环条件,return选r和l都行,一般需要保留k位小数时,取eps=1e-(k+2)

 

本题思路

观察题目数据,算法复杂度在logn及以下为宜,考虑二分

学分每天只要在学就会累加,肯定比前一天多,单调性有的

直接在天数里二分答案找满足学分修够的上课最小天数,然后减去即可,check里对任务数num判断一下就ok

 

代码

我常用的板子l和r均代表开区间!记住,平常人用的比较多的那个板子是闭区间,你这个开区间得记住,比如这题就因为开闭区间和别人不一样想了好久

1907D

 

#include<iostream>
using namespace std;
#define ll long long
ll p,t,l,n;
bool check(int m,int num)
{
	int day=(num-1)/2+1;
	if(m>=day)
	{
		return(m*l+t*num>=p);
	}
	else return(m*l+m*2*t>=p);
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	int tc;
	cin>>tc;
	while(tc--)
	{
		cin>>n>>p>>l>>t;
		int num=(n-1)/7+1;
		int l=0,r=n+1;
		while(l+1<r)
		{
			int mid=l+r>>1;
			if(check(mid,num))r=mid;
			else l=mid;
		}
		cout<<n-r<<endl;
	}
	return 0;
}
posted @ 2023-12-06 20:15  modemingzi  阅读(19)  评论(0)    收藏  举报