您的位置:首页 > 其它

(CSU - 1973)给自己出题的小X

2017-09-11 20:53 225 查看

(CSU - 1973)给自己出题的小X

Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 207 Solved: 78

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}.

思路:正如题面中所描述的,出题人的意图是出一个搜索题。 该题,是按一定顺序枚举子集,然后检查子集是否合法。 时间上,子集数目最多为2n个,判断是否合法可以在搜索过程中检查,因此时间复杂度为O(T∗2n),T为数据组数不过根据题目数据范围xi≤200,合理地搜索一定可以剪枝,因此实际上搜索用时会低于极限复杂度,时间上可以接受。

具体来说:第一步还是先排个序,这样,”任意两个元素差值都大于集合内的元素数量”就等价于“排序后间隔最小的两个相邻元素差值大于集合内的元素数量”;然后,可以从2开始枚举集合里的元素数目,在确定了元素数目之后dfs依次搜索第i个数,dfs过程中保证第i个数合法。

#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn=30;
int f[maxn][maxn][maxn];

int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
for(int i=1;i<=n;i++) scanf("%d",a+i);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) f[i][1][j]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: