Acwing二分和前缀和(二)

news2025/3/15 15:26:44

机器人跳跃问题

原题链接:https://www.acwing.com/activity/content/problem/content/1570/

二分查找更新条件只有两种:

  • R=mid;else L=mid+1:mid=(L+R)/2
  • L=mid;else R =mid-1:mid=(L+R+1)/2

这两种更新条件的结果是一样的。

#include<iostream>
#include<cstdio>

using namespace std;
const int N = 1e5 + 10;
int n;
int h[N];

bool check(int e) {
    for (int i = 1; i <= n; i++) {
        e = e * 2 - h[i];
        if (e >= 1e5)
            return true;
        if (e < 0)
            return false;
    }
    return true;
}

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &h[i]);
    }
    int l = 0, r = 1e5;
    while (l < r) {
        int mid = (l + r) / 2;
        if (check(mid))
            r = mid;
        else
            l = mid + 1;
    }
    printf("%d", l);
    return 0;
}

四平方和(拉格朗日定理)

原题链接:https://www.acwing.com/problem/content/1223/

  • 数据范围5*1e6:最多只能枚举2个数
  • 用空间换时间

三重循环时间太长:
image.png

#include<iostream>
#include<cstdio>
#include "cmath"

using namespace std;
const int N = 5 * 1e6 + 10;
int n;

int main() {
    scanf("%d", &n);
    for (int a = 0; a * a < n; a++) {
        for (int b = a; a * a + b * b < n; b++) {
            for (int c = b; a * a + b * b + c * c < n; c++) {
                int t = n - a * a - b * b - c * c;
                int d = sqrt(t);
                if (d * d == t) {
                    printf("%d %d %d %d", a, b, c, d);
                    return 0;
                }
            }
        }
    }
    return 0;
}

结构体+二分查找,可以通过oj:

#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;
const int N = 5 * 1e6 + 10;

struct Sum {
    int s, c, d;

    bool operator<(const Sum &t) const {
        if (s != t.s)return s < t.s;
        if (c != t.c)return c < t.c;
        return d < t.d;
    }
} sum[N];

int n, m;


int main() {
    scanf("%d", &n);
    for (int c = 0; c * c <= n; c++) {
        for (int d = c; c * c + d * d <= n; d++) {
            sum[m++] = {c * c + d * d, c, d};
        }
    }
    sort(sum, sum + m);
    for (int a = 0; a * a <= n; a++) {
        for (int b = a; a * a + b * b <= n; b++) {
            int t = n - a * a - b * b;
            int l = 0, r = m - 1;
            while (l < r) {
                int mid = l + r >> 1;
                if (sum[mid].s >= t)r = mid;
                else l = mid + 1;
            }
            if (sum[l].s == t) {
                printf("%d %d %d %d", a, b, sum[l].c, sum[l].d);
                return 0;
            }
        }
    }
    return 0;
}

哈希在这道题中慢于二分:
image.png

#include<iostream>
#include<cstdio>
#include<algorithm>
#include "unordered_map"

#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 5 * 1e6 + 10;
unordered_map<int, PII> s;
int n, m;

int main() {
    scanf("%d", &n);
    for (int c = 0; c * c <= n; c++) {
        for (int d = c; c * c + d * d <= n; d++) {
            int t = c * c + d * d;
            if (s.count(t) == 0)s[t] = {c, d};
        }
    }
    for (int a = 0; a * a <= n; a++) {
        for (int b = a; a * a + b * b <= n; b++) {
            int t = n - a * a - b * b;
            if (s.count(t)) {
                printf("%d %d %d %d", a, b, s[t].x, s[t].y);
                return 0;
            }
        }
    }
    return 0;
}

分巧克力

原题链接:https://www.acwing.com/problem/content/1229/

要求符合check的最大值。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include "unordered_map"

using namespace std;
typedef long long LL;
const int N = 1e5 + 0;
int n, m;
int h[N], w[N];

bool check(int mid) {
    LL res = 0;
    for (int i = 0; i < n; ++i) {
        res += (LL) h[i] / mid * (w[i] / mid);
        if (res >= m)return true;
    }
    return false;
}

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++) {
        scanf("%d%d", &h[i], &w[i]);
    }
    int l = 1, r = 1e5;
    while (l < r) {
        int mid = l + r + 1 >> 1;
        if (check(mid))l = mid;
        else r = mid - 1;
    }
    printf("%d", l);
    return 0;
}

激光炸弹

原题链接:https://www.acwing.com/problem/content/101/

一共分为三个部分:

  • 输入二维数组
  • 计算前缀和
  • 枚举所有区间

分别对应下面的三个for循环:

#include<iostream>
#include<algorithm>

using namespace std;
const int N = 5010;
int sum[N][N];

int main() {
    int n, r;
    cin >> n >> r;
    r = min(5001, r);
    int maxx = 0, maxy = 0;
    for (int i = 0, x, y, w; i < n; i++) {
        cin >> x >> y >> w;
        x++;
        y++;
        maxx = max(maxx, x);
        maxy = max(maxy, y);
        sum[x][y] += w;
    }
    for (int i = 1; i <= 5001; i++) {
        for (int j = 1; j <= 5001; j++) {
            sum[i][j] = sum[i][j] + sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1];
        }
    }
    int res = 0;
    for (int i = r; i <= 5001; i++) {
        for (int j = r; j <= 5001; j++) {
            res = max(res, sum[i][j] - sum[i - r][j] - sum[i][j - r] + sum[i - r][j - r]);
        }
    }
    cout << res;
    return 0;
}

输入部分,sum[x][y]需要通过+=而不是=。因为一个点可能有多个目标。
必须要调整r的范围,否则无法进入后面的循环。r = min(5001, r);
一直计算到了5001,是因为这个数字的平方复杂度比较小,可以接受。

K倍区间

原题链接:https://www.acwing.com/problem/content/1232/

如果通过枚举端点,累加求和的方式,复杂度为平方。也可以接受,但不是最优。
可以通过前缀和。
如果是K倍区间,那么两个前缀和做差之后模K余0。
这两个前缀和一定是模K同余的。
可以将同余的个数N存储起来。
那么同余的K倍区间的个数就是1+2+…N-1。
把所有余数的情况的加起来就是最终的答案。

#include<iostream>
#include<algorithm>

using namespace std;
typedef long long LL;

const int N = 1e5 + 10;
int n, k;
LL s[N];
int cnt[N];

int main() {
    scanf("%d%d", &n, &k);
    for (int i = 1; i <= n; i++) {
        scanf("%d", s + i);
        s[i] += s[i - 1];
    }
    LL res = 0;
    cnt[0]++;
    for (int i = 1; i <= n; i++) {
        res += cnt[s[i] % k];
        cnt[s[i] % k]++;
    }
    printf("%lld", res);
    return 0;
}

上面的代码把累加的过程放在for循环中,一个字 ,绝!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1453272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STL:优先级队列的实现

STL中优先级队列本质上就是堆。在上一篇博客中讲到过&#xff1a;堆是一种完全二叉树&#xff0c;逻辑结构上看起来像树&#xff0c;但在物理结构中是存储在线性表中。与普通线性表不同的是&#xff0c;堆中数据大小是规律排列的&#xff1a;小堆中每个节点都大于它的父节点&am…

FPGA中的模块调用与例化

目录 一、模块调用与实例化 1.1 模块调用 1.2 模块实例化 1.3 Verilog例化语句及其用法 1.3.1 例化语句的基本格式 1.3.2 实例化三种不同的连接方法 二、模块调用实例-全加器与半加器 2.1 半加器模块 2.2 全加器模块 三、参数定义关键词与整数型寄存器 3.1 参数定义关…

《区块链公链数据分析简易速速上手小册》第10章:未来趋势和挑战(2024 最新版)

文章目录 10.1 区块链技术的发展方向10.1.1 基础知识10.1.2 重点案例&#xff1a;构建一个简单的智能合约步骤1: 创建智能合约步骤2: 部署智能合约步骤3: 使用Python与智能合约交互结语 10.1.3 拓展案例 1&#xff1a;探索 DeFi 应用准备工作实现步骤步骤1: 获取Compound市场数…

代码随想录算法训练营第二十天|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

tips&#xff1a; 二叉搜索树一定是中序遍历&#xff0c;因为只有中序遍历二叉搜索树它的元素才是有序的。 回溯法则使用后序遍历方式&#xff0c;左右中&#xff0c;主要处理逻辑在中。采用后序是因为中的处理逻辑需要左分支和右分支递归带回来的处理结果&#xff0c;从而通过…

MySQL 基础知识(九)之视图

目录 1 视图的介绍 2 视图算法 3 创建视图 4 查看视图结构 5 修改视图 6 删除视图 7 参考文档 1 视图的介绍 视图是一张并不存储数据的虚拟表&#xff0c;其本质是根据 SQL 语句动态查询数据库中的数据。数据库中只存放了视图的定义&#xff0c;通过 SQL 语句使用视图时…

OpenHarmony系统解决方案 - 配置屏幕方向导致开机动画和Launcher显示异常

问题环境 系统版本&#xff1a;OpenHarmony-3.2-Release 问题现象 配置设备默认方向&#xff0c;例如修改为横屏显示&#xff0c;修改文件display_manager_config.xml的buildInDefaultOrientation参数值为2(Orientation::HORIZONTAL)。 源码中文件位于foundation/window/win…

[AIGC ~ coze] Kafka 消费者——从源码角度深入理解

Kafka 消费者——从源码角度深入理解 一、引言 Kafka 是一个分布式的流处理平台&#xff0c;广泛应用于大规模数据处理和实时数据管道。在 Kafka 生态系统中&#xff0c;消费者扮演着至关重要的角色&#xff0c;它们从 Kafka 主题中读取数据并进行处理。本文将深入探讨 Kafka …

Linux工具篇Vim

分享Linux的一些基础的工具&#xff0c;今天分享的就是Linux下的vim&#xff0c;vim其实是一个编辑器。我们可以理解为Windows下的一个记事本。 这个是vim的键盘图。 Linux编辑器-vim使用 vi/vim 的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是 vim 是…

【机器学习笔记】11 支持向量机

支 持 向 量 机 &#xff08; Support Vector Machine,SVM &#xff09; 支 持 向 量 机 是 一 类 按 监 督 学 习 &#xff08; supervisedlearning&#xff09;方式对数据进行二元分类的广义线性分类器&#xff08;generalized linear classifier&#xff09;&#xff0c;其…

Codeforces Round 919 (Div. 2)题解(A-E)

https://codeforces.com/contest/1920 A Satisfying Constraints 链接&#xff1a;A - Satisfying Constraints 代码 #include <bits/stdc.h> using namespace std; int main() {int T;cin >> T;while(T--){int n;scanf("%d", &n);vector<int&…

RK3399平台开发系列讲解(USB篇)USB 枚举和断开过程

🚀返回专栏总目录 文章目录 一、连接与检测二、USB设备枚举三、断开过程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢介绍 USB 枚举/断开过程。 一、连接与检测 二、USB设备枚举 USB设备枚举一

A股上市公司绿色化转型指数(2007-2022)

数据来源&#xff1a;上市公司年报、上市公司网站信息、上市公司社会责任报告 时间跨度&#xff1a;2007-2022年 数据范围&#xff1a;中国A股上市公司 数据指标 参考Loughran & Mcdonald&#xff08;2011&#xff09;的研究&#xff0c;利用年报中披露的文本信息测量企业…

【机器学习】逻辑回归(二元分类)

文章目录 感知器的种类sigmoid&#xff08;logistics&#xff09;函数代价/损失函数&#xff08;cost function&#xff09;——对数损失函数&#xff08;log loss function&#xff09;梯度下降算法&#xff08;gradient descent algorithm&#xff09;正则化逻辑回归&#xf…

web 发展阶段 -- 详解

1. web 发展阶段 当前处于 移动 web 应用阶段。也是个风口&#xff08;当然是针对有能力创业的人来说的&#xff09;&#xff0c;如 抖音、快手就是这个时代的产物。 2. web 发展阶段引出前后端分离的过程 2.1 传统开发方式 2.2 前后端分离模式 衍生自移动 web 应用阶段。 3.…

第9讲重写登录成功和登录失败处理器

重写登录成功和登录失败处理器 common下新建security包&#xff0c;再新建两个类&#xff0c;LoginSuccessHandler和LoginFailureHandler Component public class LoginSuccessHandler implements AuthenticationSuccessHandler {Overridepublic void onAuthenticationSuccess…

论文阅读:四足机器人对抗运动先验学习稳健和敏捷的行走

论文&#xff1a;Learning Robust and Agile Legged Locomotion Using Adversarial Motion Priors 进一步学习&#xff1a;AMP&#xff0c;baseline方法&#xff0c;TO 摘要&#xff1a; 介绍了一种新颖的系统&#xff0c;通过使用对抗性运动先验 (AMP) 使四足机器人在复杂地…

实战 | 使用CNN和OpenCV实现数字识别项目(步骤 + 源码)

导 读 本文主要介绍使用CNN和OpenCV实现数字识别项目,含详细步骤和源码。 前 言 在当今世界,深度学习和图像处理技术正在各个应用领域得到利用。在这篇博文中,我们将使用卷积神经网络 (CNN) 和 OpenCV 库完成数字识别项目。我们将逐步掌握该项目如何执行。 项目准…

Java实战:构建智能工作量统计系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

设计模式Python实现

过年在家瞎折腾&#xff0c;闲着无聊看到设计模式&#xff0c;于是就想着用Python实现一下。 简单工厂 根据传入的参数决定创建出哪一种产品类的实例。 class CashFactory:def createCashAdapter(self, type):if type "满100减20":return CashReturn(100, 20)elif…

生成式 AI - Diffusion 模型 (DDPM)原理解析(1)

来自 论文《 Denoising Diffusion Probabilistic Model》&#xff08;DDPM&#xff09; 论文链接&#xff1a;https://arxiv.org/abs/2006.11239 Hung-yi Lee 课件整理 简单地介绍diffusion model 的基本概念&#xff0c;diffusion model有很多不同的变形&#xff0c;现在比较…