首页 > 其他分享 >二分专题

二分专题

时间:2024-07-14 16:51:28浏览次数:13  
标签:二分 专题 cout int mid 1000000 long check

二分最重要的就是check函数的编写以及边界的控制

1.一定区间的完全平方数个数(除二分以外的简单写法)

查看代码

cout << (int)(floor(sqrt(b)) - ceil(sqrt(a)) + 1) << endl;

2.跳石头(为了最大化最小间隙,通过二分跳跃距离,期间通过和撤走石头数量进行比较,来判断此距离是否过短或过长)

查看代码
 bool check(int x)
{
    int sum=0,shi=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i]-shi<x)sum++;
        else shi=a[i];
    }
    if(sum>m)return 0;
    return 1;
}

3.Greedy Gift Takers(此题有一个先决条件,如果第x只牛吃不到,那么后面的n-x只都吃不到)

查看代码
 #include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,ma;
int l=0,r=0;
int a[1000000],b[1000000];
int check(int x)//判断x是否能吃到滴牛牛
{
    for(int i=1;i<=x-1;i++)b[i]=a[i];
    sort(b+1,b+x);//排序便于一个接一个的顺序插入
    int bu=n-x;
    for(int i=1;i<=x-1;i++)
    {
        if(b[i]<=bu)bu++;//如果x前面的牛牛都会插入到x后面,就继续
        else return 0;//如果有一个不行就完damn
    }
    return 1;
}
signed main()
{
     cin>>n;
     for(int i=1;i<=n;i++)
     {
         cin>>a[i];
     }
     int p=0;
     r=n+1;
     while(l+1<r)
     {
         int mid=l+r>>1;
         if(check(mid))l=mid;
         else r=mid;
     }
     cout<<n-l<<endl;
     return 0;
}

4.借教室(循环记录借出还入情况绝对会爆,所以采取前缀和的方式来记录)

查看代码
 #include <bits/stdc++.h>
#define int long long
#define PII pair<int,int>
using namespace std;
int n,m,k,ans,l,r;
int a[1000000],b[1000000],s[1000000],t[1000000],c[1000000],f[1000000];
vector<PII>v;
bool check(int x)
{
    memset(f,0,sizeof f);
    for(int i=1;i<=x;i++)//把前面的需求和返还情况都总结出来
    {
        f[s[i]]+=b[i];
        f[t[i]+1]-=b[i];
    }
    //原理就是用前缀和来看当天的教室借出返还情况,再进行比较
    for(int i=1;i<=n;i++)
    {
        c[i]=c[i-1]+f[i];//在第i天教室的需求情况
        if(a[i]<c[i])return 0;
    }
    return 1;
}
signed main() {
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=m;i++)
    {
        cin>>b[i]>>s[i]>>t[i];
    }
    r=m,l=1;
    if(check(m))
    {
        cout<<0;
        return 0;
    }
    while(l<r)
    {
        int mid=l+r>>1;
        if(check(mid))l=mid+1;
        else r=mid;
    }
        cout<<-1<<endl;
        cout<<l<<endl;
    return 0;
}

5.K-th Number(如果第m大的数为mid,则包含mid的且mid在其中小于第k大的数的子数组数量应该小于m,若大于就是mid取小了)

查看代码
 #include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k,m;
int a[1000000],b[1000000];
bool check(int mid)
{
    memset(b,0,sizeof b);
    int sum=0,t=0;
    for(int i=1;i<=n;i++)b[i]=b[i-1]+(a[i]>=mid);//前缀和求当前位置比mid大于等于的数量
    for(int i=k;i<=n;i++)
    {
        while(b[i]-b[t]>=k)t++;//固定后端,移动前端的方法算后端为b[i]时满足条件的子数组数量
        sum+=t;//t不清除因为b[i]只会越来越大
    }
    return sum>=m;//大于等于说明mid取小了
}
signed main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>k>>m;
        int l=0,r=0;
        for(int i=1;i<=n;i++)cin>>a[i],r=max(a[i],r);
        while(l<r)
        {
            int mid=l+r+1>>1;
            if(check(mid))l=mid;
            else r=mid-1;
        }
       cout<<r<<endl;
    }
}

标签:二分,专题,cout,int,mid,1000000,long,check
From: https://www.cnblogs.com/violet-hty/p/18301757

相关文章

  • 算法奇论——LIS 与打牌有关?看 LIS 的二分搜索解法
    《算法奇论》的第一篇文章啦~~《算法奇论》是作者开创的新的一个专栏,专门收录各种有关于计算机算法学的奇闻异事,欢迎阅读。由于本人仅14岁,知识、经验可能不足,再加上本文进度比较赶,本文可能有勘误或错别字、拼写错误,还请发现者在评论区指出,作者一定在看到评论后第一时间更正,谢......
  • java数组之线性查找、二分法查找
    一、线性查找        思想:如果想在一个数组中查找是否有某个元素,最容易想到的办法就是遍历数组,将数组中元素与想要查找的元素逐个对比,如果相等表示找到了,如果不等,则表示没找到。这就是线性查找的思想。案例说明定义数组:int[]arr1=newint[]{34,54,3,2,65,7,34,5,......
  • js 实现二分搜索算法
    二分算法搜索数字二分搜索算法是一种在有序数组中查找目标值的高效方法。其时间复杂度为(O(\logn))。下面是用JavaScript实现的二分搜索算法:functionbinarySearch(arr,target){letleft=0;letright=arr.length-1;while(left<=right){......
  • 【专题】2024餐饮行业及营销趋势报告合集PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=36256原文出处:拓端数据部落公众号2024年,餐饮行业的趋势展望聚焦于健康、国潮、单品爆款和情感体验四大方向。首先,健康成为了消费者在选择餐饮时的首要考量。人们越来越注重食材的新鲜度和健康性,对菜品的口味也有了更高的要求。这意味着餐饮品牌需......
  • 异或二分法盲注脚本分享
    异或二分法盲注脚本#-*-coding:utf-8-*-importrequestsimporttime#目标urlhost="http://localhost/sqli-labs-master/Less-5/?id="#获取数据库名defget_database():globalhostans=''foriinrange(1,......
  • 【专题】2024年国产AI大模型应用报告合集PDF分享(附原数据表)
    原文链接:tecdat.cn/?p=36958原文出处:拓端数据部落公众号进入21世纪初期,随着计算能力飞跃与大数据浪潮的席卷,AI大模型技术经历了从无到有的蜕变,从纯学术构想迅速转化为实际应用,其复杂性与功能性均实现了质的飞跃。特别是自2022年11月OpenAI推出ChatGPT以来,大模型技术正式步入公......
  • 【专题】2024中国中小企业数字化发展白皮书报告合集PDF分享(附原数据表)
    原文链接:tecdat.cn/?p=36964原文出处:拓端数据部落公众号在我国经济复苏波动加剧的背景下,中小企业经营展现出脆弱性,而AI与大模型技术则为它们开启了数字化与智能化转型的新机遇窗口。面对挑战与机遇并存的局面,中小企业应加速构建数字化能力,从平台、产品、服务三方面入手,精准选......
  • leetcode 704.二分查找
    重点区分:while(left<right) 和 while(left<=right)right=middle和right=middle-1当处于左闭右闭区间内时,while(left<=right)当处于左闭右开区间时,while(left<right)right=middle和right=middle-1,以此类推1.原理(来源代码随想录)(1)第一种情况(2)第二......
  • 二分查找的循环条件及指针终止位置问题
    二分查找的循环条件及指针终止位置问题常见的二分搜索法的循环迭代方法分为:左闭右开和左闭右闭两种方式左闭右开:由于右边界开放,例如[1,1)是矛盾的,因此循环条件为while(l<r)。闭合指后续迭代仍需要进行对其元素进行比较。因此每次迭代结束,左指针l移动到中点的下一位l=mi......
  • 单/全最短路专题 两题
    GregandGraph(Floyd)题意:Greg有一个n个点是一个有边权的有向图这个图两个点都有不一样的边(也就意味着a->b和b->a的权值是不一样的)每次操作都会删除一个点,让这个点和其他和它有关系的点都删除.对于每次删除操作,输出操作以前的最短路径之和思路:这一题的思路......