Acwing二分和前缀和(二)

机器人跳跃问题

原题链接: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循环中,一个字 ,绝!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Unity】【VR开发】针对VR项目的优化版Unity Build Settings

【背景】 编辑器中做了功能后,打包后却总会画面不满意,所以到处学习,总结成本篇,希望有用。 【准备】 本篇总结基于Unity 2021 LTS。 模板选择3D(URP) 如果URP不支持所用的部分Assets,那么也可以选择Built-in管线,不过URP肯定画面效果上要胜过Built-in。 HDRP不适用…

解决:docker创建Redis容器成功,但无法启动Redis容器、也无报错提示

解决&#xff1a;docker创建Redis容器成功&#xff0c;但无法启动Redis容器、也无报错提示 一问题描述&#xff1a;1.docker若是直接简单使用run命令&#xff0c;但不挂载容器数据卷等参数&#xff0c;则可以启动Redis容器2.docker复杂使用run命令&#xff0c;使用指定redis.co…

如何用AI绘画工具最好最省时省事的方法制作个性化头像框?

原文章链接&#xff1a;如何根据游戏素材制作主题头像框&#xff1f;实战教程来了&#xff01; - 优设网 - 学设计上优设 教程专区&#xff1a;AI绘画&#xff0c;AI视频&#xff0c;AI写作等软件类型AI教程&#xff0c; AI工具专区&#xff1a;AI工具-喜好儿aigc 在 APP 的…

P2P 应用

P2P 工作方式概述 在 P2P 工作方式下&#xff0c;所有的音频/视频文件都是在普通的互联网用户之间传输。 1 具有集中目录服务器的 P2P 工作方式 Napster 最早使用 P2P 技术&#xff0c;提供免费下载 MP3 音乐。 Napster 将所有音乐文件的索引信息都集中存放在 Napster 目录服…

Seurat 5 demo

1. 安装效果 > packageVersion("Seurat") [1] ‘5.0.0’ > packageVersion("SeuratObject") [1] ‘5.0.1’ > > packageVersion("SeuratData") [1] ‘0.2.2.9001’ > packageVersion("SeuratWrappers") [1] ‘0.3.2’…

AI:128-基于机器学习的建筑物能源消耗预测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

【LeetCode: 429. N 叉树的层序遍历 + BFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

《VulnStack》ATTCK-1

title: 《VulnStack》ATT&CK-1 date: 2024-01-29 14:53:49 updated: 2024-02-14 18:55:49 categories: WriteUp&#xff1a;Cyber-Range excerpt: 主机发现、端口扫描&#xff0c;服务探测&#xff0c;操作系统探测、nmap 漏洞库扫描、网站首页信息泄露、msf 渗透与信息收集…

【打工日常】使用docker部署linux-command解析搜索工具

一、linux-command介绍 linux-command工具是一个非盈利性的工具&#xff0c;里面记录了550 个 Linux 命令&#xff0c;内容包含 Linux 命令手册、详解、学习&#xff0c;是值得收藏的 Linux 命令速查手册。内容来自网络和网友的补充。 二、本次实践介绍 1. 本次实践简介 本次…

STM32固件库简介与使用指南

1. STM32官方标准固件库简介 STM32官方标准固件库是由STMicroelectronics&#xff08;ST&#xff09;提供的一套软件开发工具&#xff0c;旨在简化STM32微控制器的软件开发过程。该固件库提供了丰富的功能和模块&#xff0c;涵盖了STM32微控制器的各种外设&#xff0c;包括但不…

PLC-Recorder的延伸分析功能说明

目录 一、缘起 二、如何从PLC-Recorder获取数据 1、在线获取 2、全自主打开数据文件 3、延伸分析 三、设置方法 四、效果展示 一、缘起 在各个行业&#xff0c;在不同的场景中&#xff0c;朋友们拿到数据后&#xff0c;想做的事情五花八门&#xff0c;有做宏观分析的、…

MOSFET栅极应用电路分析汇总(驱动、加速、保护、自举等等)

概述 MOSFET是一种常见的电压型控制器件&#xff0c;具有开关速度快、高频性能、输入阻抗高、噪声小、驱动功率小、动态范围大、安全工作区域(SOA)宽等一系列的优点&#xff0c;因此被广泛的应用于开关电源、电机控制、电动工具等各行各业。栅极做为MOSFET本身较薄弱的环节&am…

《白话C++》第10章 STL和boost,Page67~70 std::auto_ptr

std::auto_ptr可以不经意间转移裸指针控制权 std::auto_ptr持有裸指针的控制权&#xff0c;却可以随随便便看似不经意地转移给另一个auto_ptr: #include <iostream> #include <memory>using namespace std;struct S {int a;void SetA(int a){this->a a;}~S()…

Sentinel注解@SentinelResource详解

Sentinel注解SentinelResource详解 熔断 针对访问超过限制【sentinel中配置的限制】的资源&#xff0c;通过java代码配置&#xff0c;返回一个自定义的结果&#xff0c;需要用到 SentinelResource 注解的 blockHandlerClass 和 blockHandler 属性。 blockHandlerClass&#…

Linux CPU 性能分析工具火焰图(Flame Graphs)认知

写在前面 博文内容为 《BPF Performance Tools》 读书笔记整理详细了解小伙伴可以访问作者官网&#xff1a;https://www.brendangregg.com/flamegraphs.html有油管上分享的作者在USENIX ATC 2017 的视屏理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&a…

恢复被.target勒索病毒加密的数据文件:拒绝向.target勒索病毒支付赎金

引言&#xff1a; 在当今数字时代&#xff0c;勒索病毒已成为网络安全领域的一大威胁&#xff0c;而.target勒索病毒是其中引起广泛关注的一种变种。本文将深入探讨.target勒索病毒的特点以及被其加密的数据文件恢复方法。数据的重要性不容小觑&#xff0c;您可添加我们的技术…

2024023期传足14场胜负前瞻

新的一年祝大家行大运、发大财、中大奖&#xff01;2024023期赛事由英超2场&#xff0c;德甲2场、意甲4场、西甲3场、法甲3场组成。售止时间为2月18日&#xff08;周六&#xff09;21点30分&#xff0c;敬请留意&#xff1a; 本期中深盘较少&#xff0c;1.5以下赔率仅1场&#…

阿里云服务器租用费用价格多少钱啊?一年、1个月、1小时

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

数学建模【非线性规划】

一、非线性规划简介 通过分析问题判断是用线性规划还是非线性规划 线性规划&#xff1a;模型中所有的变量都是一次方非线性规划&#xff1a;模型中至少一个变量是非线性 非线性规划在形式上与线性规划非常类似&#xff0c;但在数学上求解却困难很多 线性规划有通用的求解准…

Sora技术报告——Video generation models as world simulators

文章目录 1. 视频生成模型&#xff0c;可以视为一个世界模拟器2. 技术内容2.1 将可视数据转换成patches2.2 视频压缩网络2.3 Spacetime Latent Patches2.4 Scaling transformers 用于视频生成2.5 可变的持续时间&#xff0c;分辨率&#xff0c;宽高比2.6 抽样的灵活性2.7 改进框…