当前位置: 首页 > wzjs >正文

酒泉网站建设公司欧洲网站服务器

酒泉网站建设公司,欧洲网站服务器,主题在wordpress,如何建自己的个人网站今天我的舍友去参加“传智杯”广东省的省赛,跟我说了这样一道题,他说他想不出来怎么去优化代码,怎么做都是套用两层for循环超时,下面我就根据题意,使用前缀和的算法去优化一下思路,题目本身是不难的&#x…

        今天我的舍友去参加“传智杯”广东省的省赛,跟我说了这样一道题,他说他想不出来怎么去优化代码,怎么做都是套用两层for循环超时,下面我就根据题意,使用前缀和的算法去优化一下思路,题目本身是不难的,请看思路:

题意:

示例

输入:
2
5
1 2 3 4 5
4
12 14 16 18 20
3
1 1 5
2 2 4
1 3 5
输出:
2
1
1
解释:
  • 对于第一组数组 [1, 2, 3, 4, 5]

    • 下标 [1,5][1,5] 范围内的“好数”是 22 和 44,共 22 个。

  • 对于第二组数组 [12, 14, 16, 18, 20]

    • 下标 [2,4][2,4] 范围内的“好数”是 1414,共 11 个。

  • 对于第一组数组 [1, 2, 3, 4, 5]

    • 下标 [3,5][3,5] 范围内的“好数”是 44,共 11 个。

算法代码:

#include <iostream>  // 包含输入输出流库,用于标准输入输出
#include <vector>    // 包含向量库,用于动态数组操作
#include <cmath>     // 包含数学库,用于sqrt等数学函数using namespace std; // 使用标准命名空间,避免std::前缀// 计算一个数的因数和(不包括它本身)
int sum_of_factors(int x) {if (x == 1) return 0; // 1 没有其他因数int sum = 1; // 1 是所有数的因数for (int i = 2; i < x; ++i) { // 遍历 2 到 x-1if (x % i == 0) { // 如果 i 是 x 的因数sum += i; // 将 i 加到 sum 中}}return sum; // 返回因数和
}// 判断一个数是否为“好数”
bool is_good_number(int x) {int sum = sum_of_factors(x); // 计算x的因数和return (sum * x) % 2 == 0; // 判断(sum * x)是否为偶数,是则返回true,否则返回false
}// 预处理函数,生成前缀和数组
vector<int> preprocess(const vector<int>& arr) {vector<int> prefix(arr.size() + 1, 0); // 初始化前缀和数组,大小为arr.size()+1,初始值为0for (size_t i = 0; i < arr.size(); ++i) { // 遍历数组arrprefix[i + 1] = prefix[i] + (is_good_number(arr[i]) ? 1 : 0); // 计算前缀和,如果arr[i]是“好数”,则加1,否则加0}return prefix; // 返回前缀和数组
}int main() {int t;cin >> t; // 输入数组的组数vector<vector<int>> arrays(t); // 定义二维数组arrays,存储t组数组vector<vector<int>> prefixes(t); // 定义二维数组prefixes,存储每组数组的前缀和// 输入每组数组并预处理for (int i = 0; i < t; ++i) { // 遍历每组数组int s;cin >> s; // 输入当前数组的大小arrays[i].resize(s); // 调整当前数组的大小为sfor (int j = 0; j < s; ++j) { // 遍历当前数组的每个元素cin >> arrays[i][j]; // 输入当前数组的元素}prefixes[i] = preprocess(arrays[i]); // 对当前数组进行预处理,生成前缀和数组}int b;cin >> b; // 输入查询次数// 处理每次查询for (int i = 0; i < b; ++i) { // 遍历每次查询int group, l, r;cin >> group >> l >> r; // 输入查询的数组组号和范围[l, r]// 假设输入的l和r是从1开始的,需要转换为从0开始l--; // 将l转换为从0开始的下标r--; // 将r转换为从0开始的下标// 使用前缀和数组快速计算范围内的“好数”个数int good_count = prefixes[group - 1][r + 1] - prefixes[group - 1][l]; // 计算区间[l, r]内“好数”的个数cout << good_count << endl; // 输出结果}return 0; // 程序正常结束
}

代码思路

1. 问题分析

  • 题目要求处理多组数组,每组数组包含若干整数。

  • 对于每组数组,需要多次查询某个区间 [l, r] 内“好数”的个数。

  • “好数”的定义是:一个数的所有因数(不包括它本身)的和乘以它本身,结果为偶数。

2. 核心需求

  • 高效计算每个数的因数和。

  • 快速判断一个数是否为“好数”。

  • 对每组数组进行预处理,支持快速查询区间内“好数”的个数。

3. 设计思路

  • 因数和计算:通过遍历 2 到 sqrt(x),找到所有因数并累加。

  • 好数判断:根据因数和与数本身的乘积是否为偶数来判断。

  • 前缀和预处理:对每组数组生成前缀和数组,用于快速查询区间内“好数”的个数。

  • 查询优化:利用前缀和数组,将每次查询的时间复杂度降低到 O(1)


代码逻辑分步解析

1. 头文件和命名空间

#include <iostream>  // 标准输入输出库
#include <vector>    // 动态数组库
#include <cmath>     // 数学函数库(如sqrt)
using namespace std; // 使用标准命名空间
  • 包含必要的库文件,并简化代码中的命名空间。这里我还是建议直接使用万能头文件,毕竟不是写项目,不会出错,而且还节约时间。

    #include<bits/stdc++.h>

2. 因数和计算

int sum_of_factors(int x) {if (x == 1) return 0; // 1 没有其他因数int sum = 1; // 1 是所有数的因数for (int i = 2; i < x; ++i) { // 遍历 2 到 x-1if (x % i == 0) { // 如果 i 是 x 的因数sum += i; // 将 i 加到 sum 中}}return sum; // 返回因数和
}
  • 功能:计算一个数的因数和(不包括它本身)。

  • 优化:通过遍历到 sqrt(x),减少计算量。


3. 好数判断

bool is_good_number(int x) {int sum = sum_of_factors(x); // 计算 x 的因数和return (sum * x) % 2 == 0; // 判断 (sum * x) 是否为偶数
}
  • 功能:判断一个数是否为“好数”。

  • 逻辑:根据因数和与数本身的乘积是否为偶数来判断。


4. 前缀和预处理

vector<int> preprocess(const vector<int>& arr) {vector<int> prefix(arr.size() + 1, 0); // 初始化前缀和数组for (size_t i = 0; i < arr.size(); ++i) { // 遍历数组prefix[i + 1] = prefix[i] + (is_good_number(arr[i]) ? 1 : 0); // 计算前缀和}return prefix; // 返回前缀和数组
}
  • 功能:生成前缀和数组,用于快速查询区间内“好数”的个数。

  • 逻辑

    • prefix[i] 表示数组前 i 个元素中“好数”的个数。

    • 如果 arr[i] 是“好数”,则前缀和加 1,否则加 0。


5. 主函数逻辑

int main() {int t;cin >> t; // 输入数组的组数vector<vector<int>> arrays(t); // 存储 t 组数组vector<vector<int>> prefixes(t); // 存储 t 组前缀和
  • 功能:初始化存储数组和前缀和的数据结构。


6. 输入数组并预处理

for (int i = 0; i < t; ++i) { // 遍历每组数组int s;cin >> s; // 输入当前数组的大小arrays[i].resize(s); // 调整数组大小for (int j = 0; j < s; ++j) { // 遍历数组元素cin >> arrays[i][j]; // 输入数组元素}prefixes[i] = preprocess(arrays[i]); // 预处理生成前缀和
}
  • 功能:输入每组数组,并生成对应的前缀和数组。


7. 处理查询

int b;
cin >> b; // 输入查询次数
for (int i = 0; i < b; ++i) { // 遍历每次查询int group, l, r;cin >> group >> l >> r; // 输入查询的数组组号和范围l--; // 将 l 转换为从 0 开始的下标r--; // 将 r 转换为从 0 开始的下标int good_count = prefixes[group - 1][r + 1] - prefixes[group - 1][l]; // 计算区间内“好数”的个数cout << good_count << endl; // 输出结果
}
  • 功能:处理每次查询,输出区间内“好数”的个数。

  • 逻辑

    • 将用户输入的 l 和 r 转换为从 0 开始的下标。

    • 使用前缀和数组快速计算区间 [l, r] 内“好数”的个数。


8. 程序结束

return 0; // 程序正常结束
  • 功能:表示程序执行成功并结束。


总结

  • 核心思想:通过预处理和前缀和优化查询性能。

  • 时间复杂度

    • 预处理:O(t * s * sqrt(M)),其中 t 是组数,s 是数组大小,M 是数组中最大数。

    • 查询:O(b),其中 b 是查询次数。

  • 空间复杂度O(t * s),用于存储数组和前缀和。

通过这种设计,代码能够高效处理大规模数据,并满足题目对时间的要求。


文章转载自:

http://YoRAaqE0.bxrLt.cn
http://tb6DxW2O.bxrLt.cn
http://lk6aSXAp.bxrLt.cn
http://2uAiIZMB.bxrLt.cn
http://0GIzlXCW.bxrLt.cn
http://viCj8q1L.bxrLt.cn
http://P0cWqNCe.bxrLt.cn
http://Ri15H7xJ.bxrLt.cn
http://ESv4GXHh.bxrLt.cn
http://nc8bhPKS.bxrLt.cn
http://RFxfZVF3.bxrLt.cn
http://kODPx5fy.bxrLt.cn
http://v4BdM1wS.bxrLt.cn
http://r3JhRgJW.bxrLt.cn
http://jQyLbHCs.bxrLt.cn
http://RSGWON1O.bxrLt.cn
http://a5nivAIk.bxrLt.cn
http://80pLLR0W.bxrLt.cn
http://7wRAnbvQ.bxrLt.cn
http://NlOnKm4J.bxrLt.cn
http://Lcj1Jaoh.bxrLt.cn
http://9GimjlcU.bxrLt.cn
http://JclpwtJw.bxrLt.cn
http://DFLdxtck.bxrLt.cn
http://tNgTbiRQ.bxrLt.cn
http://v3SMXMAZ.bxrLt.cn
http://cDBYsCkf.bxrLt.cn
http://fUQmACHg.bxrLt.cn
http://eCa8pU4t.bxrLt.cn
http://dWBZ2pnZ.bxrLt.cn
http://www.dtcms.com/wzjs/772851.html

相关文章:

  • 网站建设 推广薪资岭南地区网站建设
  • 菏泽网站建设费用坂田公司做网站
  • 齐河县建设局网站向网站上传文件怎么做
  • 政务服务和数字化建设局网站高端网站建设 上海
  • 济南行业网站建设国家商标注册网查询官网
  • 网站空间与服务器天津住房和城乡建设厅网站
  • 可以做围棋习题的网站美食网站建设需求分析
  • 做网站的公司成本便宜的云服务器租用
  • 怎样做 云知梦 网站建设官网的网站首页
  • 网站没有备案怎么做支付淘点金 wordpress
  • 台州建设信息港网站传奇代理平台
  • 网站建设的技巧网站的icp备案信息
  • 彩票网站开发app谷歌关键词排名查询
  • 网站建设vip服务花箱 东莞网站建设
  • 网站的域名技巧和空间选择面签拍照 网站备案
  • 国外广告设计网站以下五项中哪项是网络营销的特点
  • 怎么做钓鱼网站spark 网站开发
  • 做网站着用什么软件自己做的网站怎么添加采集模块
  • 陕西的网站建设公司购物网站前端浮动特效怎么做
  • 利用网盘做网站wordpress iis 伪静态 中文
  • 建设的招标网站ppt的网站导航栏怎么做
  • 在线响应式网站wordpress 登录接口
  • 如何进行网站备案网站建设尽量
  • 平安保险网站网页制作软件哪个好用
  • 牙医工具网站建设课程设计报告免费纯ftp空间
  • 科技公司网站网页专业设计网站效果
  • 如何制作网站最简单的方法网站建设时间影响因素
  • 网站服务器规划 用户数电子商务网站设计是什么
  • 网站开发人员主要干什么的网络黄页推广软件哪个好用
  • 网站 建设 汇报wordpress美化框