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;elsel = 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.hqwc.cn/news/474646.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣经典题:环形链表的检测与返回

1.值得背的题 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode *detectCycle(struct ListNode *head) {struct ListNode*fasthead;struct ListNode*slowhead;while(fast!NULL&&fast->…

学习数据结构和算法的第9天

题目讲解 移除元素 ​ 给你一个数组nums和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val的元素&#xff0c;并返回移除后数组的新长度。 ​ 不要使用额外的数组空间&#xff0c;你必须仅使用0(1)额外空间并 原地 修改输入数组。 ​ 元素的顺序可以改变。你不需要…

【Python】【Pycharm】Python Script头文件设置

1、步骤&#xff1a;File->settings->Editor->File and CodeTemplates->Python Script 2、复制粘贴以下代码&#xff0c;应用即可&#xff1a; #!/usr/bin/env python# -*- coding: utf-8 -*-# Time :${DATE} ${TIME}# Author : admin# Site :${SITE}# Fi…

媒体邀约是什么

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 新的一年首先祝大家好运连连&#xff0c;万事兴龙&#xff01; 媒体邀约是企业或机构在有重要活动、新产品发布或其他具有新闻价值的事件时&#xff0c;向媒体发出的采访报道邀请。 以下…

互联网加竞赛 基于设深度学习的人脸性别年龄识别系统

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习机器视觉的…

Elasticsearch从入门到精通

目录 &#x1f9c2;1.简单介绍 &#x1f953;2.安装与下载 &#x1f32d;3.安装启动es &#x1f37f;4.安装启动kibana &#x1f95e;5.初步检索 &#x1f9c8;6.进阶检索 &#x1fad3;7.Elasticsearch整合 1.简单介绍&#x1f697;&#x1f697;&#x1f697; Elat…

数据分析 — Pandas 数据加载、存储和清洗

目录 一、文件读取1、常见文件读取函数2、read_csv()3、read_table()4、read_excel()5、read_json()6、read_html()7、大文件读取 二、数据保存1、csv2、excel3、json4、html5、MySQL1、连接数据库2、MySQL 存储到本地3、本地存储到 MySQL 三、数据清洗1、处理缺失值1、判断数据…

【JVM】打破双亲委派机制

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;JVM ⛺️稳中求进&#xff0c;晒太阳 打破双亲委派机制 打破双亲委派机制三种方法 自定义类加载器 ClassLoader包含了四个核心方法 //由类加载器子类实现&#xff0c;获取二进制数据调用…

2024年最新腾讯云轻量4核8G12M服务器CPU内存性价比如何?

4核8G服务器支持多少人同时在线访问&#xff1f;阿腾云的4核8G服务器可以支持20个访客同时访问&#xff0c;关于4核8G服务器承载量并发数qps计算测评&#xff0c;云服务器上运行程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&…

STL:优先级队列的实现

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

向量内外积计算器:数学与工程的巧妙结合

随着人工智能、大数据等技术的飞速发展&#xff0c;数学工具的重要性日益凸显。向量内外积作为线性代数中的基础概念&#xff0c;不仅在理论上有着深远的影响&#xff0c;在实际应用中也发挥着巨大作用。本文将从向量内外积的定义、起源、应用场景以及计算示例等方面&#xff0…

【Prometheus】组件介绍-工作流程-部署模式-数据类型-监控

基于Prometheus和K8S构建智能化告警系统 一、Prometheus简介二、Prometheus特点于样本2.1、特点2.2、样本 三、Prometheus组件介绍四、Prometheus工作流程五、Prometheus的几种部署模式5.1、基本高可用模式5.2、基本高可用远程存储5.3、基本高可用远程存储联邦集群 六、Prometh…