有实力的网站建设公司简述网站开发的几个阶段
有实力的网站建设公司,简述网站开发的几个阶段,wordpress如何做关键词和描述设置,wordpress 读取分类CSP-202109-2-非零段划分
【70分思路-暴力枚举】 这段代码的目的是在给定一个由自然数#xff08;非负整数#xff09;组成的数组后#xff0c;通过选择一个适当的正整数 p#xff0c;将数组中所有小于 p 的数变为 0#xff0c;从而使得数组中非零段的数量达到最大。这里…CSP-202109-2-非零段划分
【70分思路-暴力枚举】 这段代码的目的是在给定一个由自然数非负整数组成的数组后通过选择一个适当的正整数 p将数组中所有小于 p 的数变为 0从而使得数组中非零段的数量达到最大。这里的非零段是指连续的、非零的数组元素序列。 程序的主要逻辑分为以下几个步骤 读取数组长度 n 和数组元素同时找出数组中的最大元素 maxElem。 对于每一个可能的 p 值从 1 到 maxElem复制原始数组并将所有小于 p 的元素设置为 0。 对于每个 p 值的新数组遍历数组来计算非零段的数量。一个非零段开始于一个非零元素该元素要么是数组的第一个元素要么其前一个元素为零。非零段结束于数组的最后一个元素或一个非零元素后跟着一个零元素。 更新并记录非零段数量的最大值。 输出非零段的最大数量。
时间复杂度 第一层循环读取数组的时间复杂度为 O(n)n 是数组的长度。 第二层循环是对于每一个可能的 p 值进行迭代其最坏情况下的时间复杂度为 O(maxElem)。 在每一个 p 的值下我们又对数组进行了两次遍历一次是将小于 p 的值置为 0另一次是计算非零段的数量每次遍历的时间复杂度为 O(n)。
因此整个程序的总时间复杂度为 O(maxElem * n)这里 maxElem 是数组中的最大值n 是数组的长度。由于 maxElem 可能接近 n所以在最坏情况下时间复杂度可以近似为 O(n^2)。
#include iostream
#include vector
#include algorithm
using namespace std;
vectorintarr;int main() {long long n;int maxNum -1, maxElem -1;cin n;for (int i 0; i n; i){int t;cin t;arr.push_back(t);maxElem max(maxElem, t);}for (int p 1; p maxElem; p){// 小于 p 的数都变为 0for (auto it : arr) {if (it p) it 0;}int num 0;bool flag 1; // 1-上一位是00-上一位不是零// 统计非零段for (auto it : arr) {if (it ! 0) {if (flag) {num;}flag 0;}else{flag 1;}}// 记录最大非零段数maxNum max(maxNum, num);}cout maxNum;return 0;
}【100分思路-差分数组】 初始化和输入处理定义了两个向量numbers和diff分别用于存储输入的数列和差分数组。numbers的大小比实际数列长度多2这是为了在数列的开始和结束添加边界值0以方便处理。 去重和边界处理使用unique函数去除连续的重复元素这对于减少不必要的计算特别有效因为连续的相同数值不会增加非零段的数量。 差分数组的构建: 差分数组diff用于记录每个可能的数值对应的变化峰值增加谷值减少。这实际上是对数列进行一种“转化”使得后续的求解更加直接和高效。遍历数列如果当前数字是一个峰值即比前一个和后一个数都大则在差分数组对应位置加一如果是谷值即比前一个和后一个数都小则减一。 通过差分数组求解答案: 通过遍历差分数组的累加和即从后向前计算前缀和可以找出使非零段数量最大化的数值。这是因为差分数组的前缀和反映了在当前阈值下非零段的增减情况。
时间复杂度
初始化和输入处理O(N)其中N是数列的长度。去除连续重复元素最坏情况下O(N)因为需要检查每个元素是否与前一个相同。构建差分数组O(N)每个元素至多被访问一次。通过差分数组求解答案O(V)其中V是数值的最大可能值这里是MAX_VALUE。因此总体时间复杂度为O(N V)其中N是数列的长度V是数值的最大可能范围。
#include iostream
#include vector
#include algorithm
#include cstring
using namespace std;const int MAX_NUM 500000; // 最大数字数量
const int MAX_VALUE 10000; // 最大值
vectorint numbers(MAX_NUM 2); // 使用vector存储输入的数列
vectorint diff(MAX_VALUE 1); // 使用vector存储差分数组int main() {int length;cin length;for (int i 1; i length; i) {cin numbers[i];}numbers[0] numbers[length 1] 0; // 将边界设置为0// unique函数去除连续重复元素更新vector的有效长度length unique(numbers.begin(), numbers.begin() length 2) - numbers.begin() - 1;// 初始化差分数组为0fill(diff.begin(), diff.end(), 0);for (int i 1; i length; i){if (numbers[i - 1] numbers[i] numbers[i] numbers[i 1]) {diff[numbers[i]]; // 如果是峰值对应的差分数组加一}else if (numbers[i - 1] numbers[i] numbers[i] numbers[i 1]) {diff[numbers[i]]--; // 如果是谷值对应的差分数组减一}}// 通过差分数组求解答案int maxSegments 0, sum 0; // maxSegments记录最终答案sum记录差分的前缀和for (int i MAX_VALUE; i 1; i--) {sum diff[i]; // 累加差分得到前缀和maxSegments max(maxSegments, sum); // 更新答案}cout maxSegments endl; return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/90498.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!