读入整数到vector中,每次都固定最左边的位置,然后查找满足最条件的最右边的位置,中间的位置个数可进行排列组合,假如有nums个,则这种情况的解有nums*(nums-1)/2种情况。然后将最左边的位置向右移动一个继续统计,最右边的位置在满足条件的情况下需要进行更新,不需要从最左边的位置重新开始计算。参考了一个Python3版本的解。
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
long long fun(const vector<long> vec, long dist)
{
long long rst = 0;
long n = vec.size();
long right = 2;
for(long i=0;i<n-2;i++)
{
long left = i;
while(right < vec.size() && vec[right] - vec[left] <= dist)
{
right++;
}
if(right - left >= 3)
{
long nums = right-left-1;
rst += nums * (nums -1)/2;
rst %= 99997867;
}
}
return rst;
}
int main()
{
long n,dist;
cin >> n >> dist;
vector<long> m_vec;
while(n--)
{
long a;
cin >> a;
m_vec.push_back(a);
}
cout << fun(m_vec,dist) << endl;
return 0;
}
京公网安备 11010502036488号