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 @ 2025-02-10 16:55  Kazuma_124  阅读(22)  评论(0)    收藏  举报