比赛 普及组2016模拟练习3 评测结果 AAAAAAAAAA
题目名称 圆桌会议 最终得分 100
用户昵称 __stdcall 运行时间 0.026 s
代码语言 C++ 内存使用 0.31 MiB
提交时间 2016-11-15 20:19:26
显示代码纯文本
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>

using namespace std;

int n,k;
int h[20];
bool used[20];
int tb[20];
int cnt = 0;

void dfs( int idx ) {
    if( idx == n+1 ) {
        if( abs( tb[n]-tb[1] ) <= k ) ++cnt;
        return;
    }
    for( int i = 2; i <= n; ++i ) { // 下一个位置的牛,h[1]已经被钦定了,所以i从2开始
        if( !used[i] && abs( h[i]-tb[idx-1] ) <= k ) {
            used[i] = true;
            tb[idx] = h[i];
            dfs(idx+1);
            used[i] = false;
        }
    }
}

int main() {
    freopen( "round.in", "r", stdin );
    freopen( "round.out", "w", stdout );
    scanf( "%d%d", &n, &k );
    for( int i = 1; i <= n; ++i ) scanf( "%d", &h[i] );
    used[1] = true; tb[1] = h[1]; // 因为是圆桌,所以固定第一头牛不变
    dfs(2);
    printf( "%d\n", cnt );
    return 0;
}