2023.12.6 cf1902B
二分
一般来讲我们会在以下情况用到二分:
- 求单调函数的零点
- 求最小值的最大,或最大值的最小
- 很难直接算出答案,但是很好判定答案合不合法
二分答案和二分查找差不多,就是check函数内是贪心dp之类的东西
当用二分控制精度时,以r-l>eps为循环条件,mid选r和l都行,一般需要保留k位小数时,取eps=1e-(k+2)
本题思路
观察题目数据,算法复杂度在logn及以下为宜,考虑二分
学分每天只要在学就会累加,肯定比前一天多,单调性有的
直接在天数里二分答案找满足学分修够的上课最小天数,然后减去即可,check里对任务数num判断一下就ok
代码
#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;
}
标签:二分,int,mid,tc,num,check,刷题
From: https://www.cnblogs.com/modemingzi-csy/p/17880443.html