• 北京大学冯哲清北学堂讲课day1


    贪心方案:

    答案是第三个策略

    二分的一个重点是有顺序性,只有满足这个件才可以二分判断区间,否则你得自己构造顺序。

    洛谷跳石头同题:

    首先,我们要最小化最大跳远距离

    代码如下(此题)

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    
    #define N 300005
    
    using namespace std;
    
    int i,j,m,n,p,k,a[N],x;//r为right,l为left
    
    int check(int x)//判断mid是否符合条件
    {
            int i,cnt=0;
            for (i=1;i<=n;++i) if (a[i]-a[i-1]>x) return 0;//x过小,直接右边查找
            for (i=0;i<n;)
            {
                    for (j=i;j<=n&&a[j]-a[i]<=x;++j);//处理a数组,使判断时改为石头间距离
                    ++cnt;//计数器加一
                    i=j-1;//删除这个点
            }
            if (cnt<=m) return 1;
            return 0;
    }
    
    int main()
    {
            scanf("%d%d",&n,&m);
            for (i=1;i<=n;++i) scanf("%d",&a[i]);
            sort(a+1,a+n+1);//从小到大排序石头距离
            int l=0,r=(int)1e9,mid=0;//数据范围没给,直接定义1e9(反正log1e9也不是很大)
            while ((l+r)>>1!=mid)//如果头尾平均数不等于上一次循环的mid(不能再分了,间隔为1时结束循环)
            {
                   mid=(l+r)>>1;//二分灵魂
                   if (check(mid)) r=mid;//返回值为1,就是大了;返回值为0,就是小了
                   else l=mid;//返回值为0的话,就取右半边
            }
            printf("%d
    ",r);
    }

    看起来很像贪心是不是?

    然而贪心是错的。QWQ

     

    三分:能对单峰函数求峰值

     

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    
    #define N 500005
    
    using namespace std;
    
    int i,j,m,n,p,k,a[N],ty,x;
    
    long long b[N];
    
    double check(int x)
    {
            return 1.*(b[x-1]+a[n])/x;
    }
    
    int main()
    {
            scanf("%d",&m);
            for (;m--;)
            {
                    scanf("%d",&ty);
                    if (ty==1) 
                    {
                            scanf("%d",&x);
                            a[++n]=x;
                            b[n]=b[n-1]+x;
                    }
                    else
                    {
                            int l=1,r=n;
                            while (r-l>10)
                            {
                                int len=(r-l+1)/3,mid1=l+len,mid2=mid1+len;
                                if (check(mid1)<check(mid2)) r=mid2;
                                else l=mid1;
                            }
                            double ans=0;
                            for (i=l;i<=r;++i) ans=max(ans,a[n]-check(i));
                            printf("%.10lf
    ",ans);
                    }
            }
    }

    然后;老师开始了分治。

     第一题:快速幂

    我直接连接我的博客(因为讲的是重复的内容)

     https://www.cnblogs.com/lbssxz/p/10656598.html

    我这个是取模的运算,你要的话去了就行

    然后是:

     

    你会发现,红点和中心的那三个黑点是等价的,都不能分。

  • 相关阅读:
    【Python】版本自动控制/在上一次版本中自动生成本次的版本号
    【Python】获取当前国内时间(适用于服务器部署在国外的)
    【Python】url编码/解码/转义
    mysql 优化详解
    shiro-redis整合
    springboot 整合redis ,jedis
    maven的pom配置详解
    SpringMVC集成LogBack,相关配置
    客户端连接caching-sha2-password 报错问题
    (转)navicat premium 12 破解版,注册机激活
  • 原文地址:https://www.cnblogs.com/lbssxz/p/10785863.html
Copyright © 2020-2023  润新知