看了半天题目,好像除了暴力枚举没什么别的方法...而且题目3s,这是在暗示枚举啊...
// Problem#: 1373
// Submission#: 3311134
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include<iostream>
#include<algorithm>
using namespace std;
int a[15], h[15], n, k;
int main() {
while (cin >> n >> k) {
for (int i = 1; i <= n; i++) {
cin >> h[i];
a[i] = i;
}
if (n == 1) { // 坑人的情况
cout << 1 << endl;
continue;
}
int ans = 0;
do {
bool f = true;
for (int i = 1; i < n && f; i++) { // 依次比较,如果差太多跳出
if (abs(h[a[i + 1]] - h[a[i]]) > k) {
f = false;
}
}
if (abs(h[a[1]] - h[a[n]]) > k) { // 头和尾比较,连起来的时候是相邻的
f = false;
}
if (f) {
ans++;
}
} while (next_permutation(a + 2, a + 1 + n));// 因为是圆排列,所以从第二个开始排就可以了
cout << ans << endl;
}
}