编程题(C++)---万万没想到之抓捕孔连顺

万万没想到之抓捕孔连顺

在这里插入图片描述
在这里插入图片描述
编程思路:编程时不能利用三重循环来计算,否则程序时间复杂度过大,加上数据量大,会超时。所以计算时采用定点思维,由第一个点以D为单位向后推进,每个定位点到他后边D范围利用排列组合任取3个点进行计算(不利用排列组合逐个去求必然超时)。

#include <iostream>

using namespace std;

int main()
{
    int N,D,bulidings[1000000+5];  
    long outcome=0;
    cin>>N>>D;
    for(int i=0; i<N; i++)
        cin>>bulidings[i];
    for(int i=0,j=1; i<N-2; i++)
    {
        while(j<N&&bulidings[++j]-bulidings[i]<=D);        //用来判断此位置到距离为D的位置中间有多少建筑
        j--;
        if(j-i>=2)
            outcome+=(long long)(j-i)*(long long)(j-i-1)/2;//已知两点间建筑数,求
        outcome%99997867;                                  //根据题目要求,防止溢出

    }
    cout<<outcome%99997867;
    return 0;
}

posted @ 2021-03-20 17:18  沉淀i  阅读(10)  评论(0)    收藏  举报  来源