读入整数到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; }