ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

二分、三分、01分数规划

2022-08-22 17:34:33  阅读:194  来源: 互联网

标签:二分 分数 01 ai ll mid int tmp


二分、三分、01分数规划

二分查找

单调函数求零点

二分查找:在一个单调有序的集合中查找元素,每次将集合分为左右两个部分,判断解在哪个部分中并调整集合上下界,重复直到找到目标元素。

//找>=x的第一个位置
//求最小值
int l=0,r=ll,mid;
while(l<r)
{
    mid=l+(r-l>>1);			//(l+r)/2
    if(judge(mid))	r=mid;
    else	l=mid+1;
}
//逐渐减小
cout<<r<<endl;
//在r的位置
//最小值尽量大



//找<=x的最后一个位置
//求最大值
int l=0,r=ll,mid;
while(l<r)
{
	mid=l+(r-l+1>>1);		//(l+r+1)/2
    if(judge(mid))	l=mid;
    else	r=mid-1;
}
//逐渐扩大
cout<<l<<endl;
//在l的位置
//最大值尽量小
//a[mid]<=x 为需要满足的条件

STL 二分查找函数

#include <algorithm>
binary_search	//返回bool值,是否存在
lower_bound		//返回可插入的最小位置的迭代器,即返回第一个符合条件的元素位置
upper_bound		//返回可插入的最大位置的迭代器,即返回最后一个符合条件的元素位置
//返回的迭代器是指针类型	用返回的迭代器减去a就能得到下标
upper_bound(a,a+10,55)
//1 2 3 3 5 6 9
//插入3,在4这个位置,可插入的最大位置

二分答案+检验

二分枚举+检验:将求解类问题转化为验证类问题

假设距离最近的两个牛棚间的距离为x,牛棚坐标为xi , 先把xi 排序,对于一个解m,验证是否可行,在第一个点放置一头牛,从左向右O(n) 扫描一遍牛棚,第i个点如果和上一个放置点的距离>=m,就在第i个点防放置一头牛,统计总放置的数量是否>=c

Drying

设某一次二分出的一个值为mid,对于一件ai小于等于mid的衣服直接晾干即可,对于一件ai值大于mid的衣服,最少的用时是用吹风机一段时间,晾干一段时间,设这两段时间为x1和x2,那么有mid=x1+x2,ai<=k*x1+x2,那么x1>=(ai-mid)/(k-1),所以对(ai-mid)/(k-1)向上取整就是该件衣服的最少用时。把所有吹风机的用时加起来应该<=mid

小于等于mid的衣服直接就晾干

对于大于mid的衣服,用x1的时间晾干,用x2的时间吹干,那么x1+x2<=mid k*x2+x1>=ai

解决最大值最小or最小值最大的常见方法

贪心/二分/动态规划

三分

单峰/单谷函数求最大/最小值

在left和right之间取两个点mid和midmid,假如mid比midmid大,那么波峰就不可能出现在midmid和right之间,不断逼近

01分数规划

有一对物品,每一个物品有一个收益ai,一个代价bi,我们要求每一个方案选k个物品使得所选择的 总ai/总bi 最大

收益/价值最大

类似二分答案 二分出一个x 总ai/总bi>=x 总(ai-x*bi)>=0

int n,k;
struct ty{
    int c,v;
    ll tmp;
}a[10010];

cin>>n>>k;
for(int i=1;i<=n;i++)
    cin>>a[i].c>>a[i].v;
int l=0,r=1e8+5,ans=0;
while(l<=r)
{
    int mid=l+(r-l>>1);		
    ll tmp=judge(mid);
    if(tmp==-1)	r=mid;
    else
    {
        ans=tmp;
        l=mid+1;
    }
}

bool cmp(ty a,ty b)
{
	return a.tmp>b.tmp;
}
ll judge(ll x)
{
	for(int i=1;i<=n;i++)
    {
		a[i].tmp=a[i].v-x*a[i].c;
    }
    sort(a+1,a+n,cmp);
    ll sum=0,v=0,c=0;
    for(int i=1;i<=k;i++)
    {
		sum += a[i].tmp;
        v+=a[i].v;
        c+=a[i].c;
    }
    if(sum<0)	return -1;
    else	return v/c;
}

标签:二分,分数,01,ai,ll,mid,int,tmp
来源: https://www.cnblogs.com/xushengxiang/p/16613544.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有