(CSU - 1973)给自己出题的小X
2017-09-11 20:53
225 查看
(CSU - 1973)给自己出题的小X
Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 207 Solved: 78Description
小X学习了dfs,为了练习搜索,开始给自己出题玩。玩着玩着,一会把自己难住了,一会又被自己难倒了,真是有趣诶!
小X出的题:
现在有N个不同的正整数,求它们可以组成多少个这样的集合,满足:
集合内的元素数量S>1
集合内任意两个数的差的绝对值都大于集合内的元素数量。
Input
第一行,一个正整数T(T<=20)表示数据组数。对于每组数据,有两行。第一行为一个正整数N(3≤N≤25),第二行为N个用空格隔开的正整数xi(xi≤200)。
Output
对于每组数据,输出一行一个整数表示题中所描述的集合的个数。Sample Input
15
2 3 5 8 1
Sample Output
6Hint
{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; }
相关文章推荐
- csu D(1973): 给自己出题的小X
- CSU 1973:给自己出题的小X(DFS或DP)
- CSU1973: 给自己出题的小X
- CSUOJ 1973 给自己出题的小X DFS
- 278 First Bad Version 【拓展分析,自己出题】
- 关于CSU 1725以及CodeForce 148D自己的解法
- COJ1973-给自己出题的小X
- CSU - 1973
- CSU - 1973
- CSU_BMW正式组队纪念赛出题+部分解题报告
- WPF之拖动项滚动条自滚动(当拖动项到达高度的边界时候滚动条自己可以上下滚动)
- jarsigner 用自己的签名文件签名apk
- Android应用如何监听自己是否被卸载及卸载反馈功能的实现
- 自己写的一点福利代码(一)
- 自己写的一个连连看的算法
- 淘宝工作记,记录自己从来淘宝实习到拿到offer的全过程
- IT人如何找到自己的时间?
- 打造自己的高效团队
- 自己录了一首歌,嘻嘻
- 第一次写自己的博客,以后会有更多的技术文章,希望大家支持.