C++前缀和算法的应用:最大化城市的最小供电站数目(二)

简介: C++前缀和算法的应用:最大化城市的最小供电站数目

3月旧代码

class Solution {
public:
long long maxPower(vector& stations, int r, int k) {
m_c = stations.size();
CalPower(stations, r);
long long left = *std::min_element(m_vPower.begin(),m_vPower.end());
long long right = left + k+1 ;
while (left + 1 < right)
{
long long iMid = (left + right) / 2;
if (Can(iMid,r,k))
{
left = iMid;
}
else
{
right = iMid;
}
}
return left;
}
void CalPower(vector stations,int r )
{
long long llCur = 0;
for (int i = 0; i < r; i++)
{
llCur += stations[i];
}
for (int i = 0; i < stations.size(); i++)
{
if (i + r < m_c)
{
llCur += stations[i + r];
}
if (i - r - 1 >= 0)
{
llCur -= stations[i - r - 1];
}
m_vPower.push_back(llCur);
}
}
bool Can( long long llMinPower, int r, int k)const
{
long long llAdd = 0;
vector vDiff(m_vPower.size());
for (int i = 0; i < m_vPower.size(); i++)
{
llAdd += vDiff[i];
const long long llNeedAdd = llMinPower - (m_vPower[i] + llAdd);
if (llNeedAdd <= 0 )
{
continue;
}
if (llNeedAdd > k )
{
return false;
}
const int iNewIndex = i + r + r + 1;
if (iNewIndex < m_c)
{
vDiff[iNewIndex] -= llNeedAdd;
}
llAdd += llNeedAdd;
k -= llNeedAdd;
}
return true;
}
vector m_vPower;
int m_c;
};

8月旧代码

class Solution {
public:
long long maxPower(vector& stations, int r, int k) {
m_c = stations.size();
CalPower(stations, r);
long long left = *std::min_element(m_vPower.begin(),m_vPower.end());
long long right = left + k+1 ;
while (left + 1 < right)
{
long long iMid = (left + right) / 2;
if (Can(iMid,r,k))
{
left = iMid;
}
else
{
right = iMid;
}
}
return left;
}
void CalPower(vector stations,int r )
{
long long llCur = 0;
for (int i = 0; i < r; i++)
{
llCur += stations[i];
}
for (int i = 0; i < stations.size(); i++)
{
if (i + r < m_c)
{
llCur += stations[i + r];
}
if (i - r - 1 >= 0)
{
llCur -= stations[i - r - 1];
}
m_vPower.push_back(llCur);
}
}
bool Can( long long llMinPower, int r, int k)const
{
long long llAdd = 0;
vector vDiff(m_vPower.size());
for (int i = 0; i < m_vPower.size(); i++)
{
llAdd += vDiff[i];
const long long llNeedAdd = llMinPower - (m_vPower[i] + llAdd);
if (llNeedAdd <= 0 )
{
continue;
}
if (llNeedAdd > k )
{
return false;
}
const int iNewIndex = i + r + r + 1;
if (iNewIndex < m_c)
{
vDiff[iNewIndex] -= llNeedAdd;
}
llAdd += llNeedAdd;
k -= llNeedAdd;
}
return true;
}
vector m_vPower;
int m_c;
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。

https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程

https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《闻缺陷则喜算法册》doc版

https://download.csdn.net/download/he_zhidan/88348653

充满正能量得对大家说
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
墨家名称的来源:有所得以墨记之。
算法终将统治宇宙,而我们统治算法。《喜缺全书》

测试环境

操作系统:win7 开发环境: VS2019 C++17

或者 操作系统:win10 开

发环境: VS2022 C++17

相关文章
|
12天前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
30 3
|
7天前
|
存储 算法 搜索推荐
这些算法在实际应用中有哪些具体案例呢
【10月更文挑战第19天】这些算法在实际应用中有哪些具体案例呢
16 1
|
13天前
|
机器学习/深度学习 人工智能 算法
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
47 0
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
|
7天前
|
监控 算法 数据挖掘
HyperLogLog算法有哪些应用场景呢
【10月更文挑战第19天】HyperLogLog算法有哪些应用场景呢
8 0
|
13天前
|
机器学习/深度学习 算法 数据建模
计算机前沿技术-人工智能算法-生成对抗网络-算法原理及应用实践
计算机前沿技术-人工智能算法-生成对抗网络-算法原理及应用实践
19 0
|
14天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
19 4
|
14天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
16 4
|
14天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
14 1
|
24天前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
24天前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)