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
**********************************************************************/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章