【问题描述】 有N位同学获得了奖学金,现要从中选出两位代表上台领奖。出于“审美”要求,希望选出的两位代表A和B满足:A的身高比B高,A获得的奖学金比B多,且奖学金的差额大于M。请计算选取上台同学的方案数。 【输入描述】 第一行包含两个正整数N和M; 第二行包含N个正整数Si,分别代表第i位同学获得的奖学金。输入顺序在前的同学身高较高。 【输出描述】 输出一个正整数,表示方案数。给出c++代码
时间: 2024-01-22 19:20:18 浏览: 77
```cpp
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
int n, m, s[MAXN], f[MAXN][MAXN];
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; ++i) cin >> s[i];
for (int i = 1; i <= n; ++i) {
for (int j = i + 1; j <= n; ++j) {
if (s[j] - s[i] > m) {
f[i][j] = f[j][i] = n - j + 1;
continue;
}
int k = upper_bound(s + j + 1, s + n + 1, s[i]) - s - 1;
f[i][j] = f[j][i] = n - k;
}
}
long long ans = 0;
for (int i = 1; i <= n; ++i) {
for (int j = i + 1; j <= n; ++j) {
ans += f[i][j] * (f[i][j] - 1) / 2;
}
}
cout << ans << endl;
return 0;
}
```
阅读全文