acwing算法提高课第六章基础算法

第六章 基础算法

包括位运算、递推与递归、前缀和与差分、二分、排序、RMQ等内容

位运算
AcWing 90. 64位整数乘法 可以
递推与递归

AcWing 95. 费解的开关 可以
AcWing 97. 约数之和 可以
AcWing 98. 分形之城 可以

前缀和与差分
AcWing 99. 激光炸弹 可以

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 5010;

int s[N][N];//前缀和矩阵

int main()
{
    int n,R;   
    cin>>n>>R;
    R=min(R,5001);
    //二维前缀和下标从1开始,把所有下标加上1,相当于把整个矩阵往右上角移动一格
    
    for(int i=0;i<n;i++)
    {
        int x,y,w;
        cin>>x>>y>>w;
        x++,y++;
        s[x][y]+=w;
    }
    
    //预处理前缀和
    for(int i=1;i<=5001;i++)
       for(int j=1;j<=5001;j++)
          s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
          
    int res=0;
    for(int i=R;i<=5001;i++)//横纵坐标最少是R
       for(int j=R;j<=5001;j++)
          res=max(res,s[i][j]-s[i-R][j]-s[i][j-R]+s[i-R][j-R]);
          
    cout<<res<<endl;
    return 0;
}
//求(r-1)*(r-1)的矩阵的和,暴力枚举
//当r>5002的时候可以摧毁整片区间

AcWing 100. 增减序列 可以

二分
AcWing 102. 最佳牛围栏 可以
在这里插入图片描述
右端点是1,2,3,4,5…k…n,左端点可以是1到k-F+1,枚举左端点,找到总和最大的区间
在这里插入图片描述
在这里插入图片描述

用二分枚举平均值

法一暴力枚举

#include<iostream>
using namespace std;
int A[100005];
int main(){
    int n,f;
    double ans=0;
    scanf("%d%d",&n,&f);
    for(int i=1;i<=n;i++){
        scanf("%d",&A[i]);
        A[i]+=A[i-1];   //求前缀和
    }
    for(int len=f;len<=n;len++)     //枚举区间长度
        for(int i=0,j=i+len;j<=n;i++,j++)   //枚举区间开头,根据长度得到结尾
            ans=max(ans,double(A[j]-A[i])/len);
    printf("%d",int(ans*1000));
}

法二 二分

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 100010;

int n,F;
double a[N],s[N];//a是原数组,s是前缀和数组

//二分平均值
bool check(double avg)
{
    for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i]-avg;//减去平均数后的前缀和
    
    double mins=0;
    for(int k=F;k<=n;k++)
    {
        mins=min(mins,s[k-F]);
        if(s[k]>=mins)return true;
    }
    return false;
}

int main()
{
    cin>>n>>F;
    
    double l=0,r=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        r=max(r,a[i]);
    }
    
    while(r-l>1e-5)
    {
        double mid=(l+r)/2;
        if(check(mid))l=mid;
        else r=mid;
    }
    
    printf("%d\n",(int)(r*1000));
    
    return 0;
}
//对于二分,二分是二分性而不是单调性 只要满足可以找到一个值一半满足一半不满足即可 而不用满足单调性

AcWing 113. 特殊排序 可以

排序

AcWing 105. 七夕祭 可以
AcWing 106. 动态中位数 可以
AcWing 107. 超快速排序 可以

RMQ AcWing 1273. 天才的记忆 1273

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值