CSUOJ 1973 给自己出题的小X DFS
Description
小X学习了dfs,为了练习搜索,开始给自己出题玩。
玩着玩着,一会把自己难住了,一会又被自己难倒了,真是有趣诶!
小X出的题:
现在有N个不同的正整数,求它们可以组成多少个这样的集合,满足:
- 集合内的元素数量S>1
- 集合内任意两个数的差的绝对值都大于集合内的元素数量。
Input
第一行,一个正整数T(T<=20)表示数据组数。
对于每组数据,有两行。第一行为一个正整数N(3≤N≤25),第二行为N个用空格隔开的正整数xi(xi≤200)。
Output
对于每组数据,输出一行一个整数表示题中所描述的集合的个数。
Sample Input
1 5 2 3 5 8 1
Sample Output
6
Hint
{5,8},{1,5},{1,8},{2,5},{2,8},{3,8}.
用dfs搜索,依次枚举第i个数,当准备加入下一个数时,需要检查当前的最小间隔是否大于当前的集合数量+1,在dfs时,传递一个最小值即可进行判断。
#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> using namespace std; #define INF 0x3fffffff int a[50]; int ans, n; void dfs(int pos,int dis,int gap)//dis表示数组中数字个数 gap表示任意两数之差的最小值 pos表示加入的数的位置 { if (pos == n - 1 || gap <= dis + 2)return; for (int i = pos+1; i < n; i++) { if (a[i] - a[pos]>dis + 2) { dfs(i, dis + 1, min(gap, a[i] - a[pos])); ans++; } } } int main() { int T; while (cin >> T) { while (T--) { cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } ans = 0; sort(a, a + n); for (int i = 0; i < n; i++) dfs(i, 0,INF); printf("%d\n", ans); } } return 0; } /********************************************************************** Problem: 1973 User: leo6033 Language: C++ Result: AC Time:84 ms Memory:2024 kb **********************************************************************/