C++,codeforces,363B,B. Fence

/*
codeforces,363B,B. Fence
找出长度为n的数组中长度为k的连续子数组中和最小的子数组的起始位置
*/
/*
维护一个最小值
维护一个长度为k的容器, 储存当前获取的数以及前k-1个数的和
每新获取一个数,将容器中最早获取的数删除,并将新数加入容器
计算和, 如果和小于最小值,更新最小值,并记录最早获取的数的位置
首先获取k个数,并计算和,初始化最小值,初始化答案下标
之后依次获取k-n个数, 每获取一个, 计算和,更新最小值,更新答案下标
*/
#include <iostream>
#include <vector>
int main(){
int n,k;std::cin>>n>>k;
if(n<k){
std::cout<<"wrong n<k"<<std::endl;
return 0;
}
std::vector<int> vec(k,0);
int ansIndex = 1,min=k*100;
int head = 0,currSum=0;
for(int i = 0;i<k;++i){
std::cin>>vec[i];
currSum+=vec[i];
}
min = currSum;
//currIndex = 1
for(int i = 2;i<= (n-k+1);++i){
//i从2开始并到(n-k+1)结束
//是为了方便在更新ansIndex时能直接将i赋值给ansIndex
//即将i作为以本次循环获取的数为结尾的子数组的起始位置([1,n-k+1])
currSum-=vec[head];
std::cin>>vec[head];
currSum+=vec[head];
//head=(head+1)%k;
//刚开始使用的用上面的方式,来限定head的范围
//后来觉得每次取模比较花时间, 于是改成下面的方式
++head;
if(head==k)head=0;
if(currSum<min){
min = currSum;
ansIndex = i;
}
}
std::cout<<ansIndex;
}
posted @   Kazuma_124  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示