csu D(1973): 给自己出题的小X
来源:互联网 发布:淘宝京东商城 编辑:程序博客网 时间:2024/06/05 04:24
题目:
D(1973): 给自己出题的小X
Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 38 Solved: 9
Description
小X学习了dfs,为了练习搜索,开始给自己出题玩。
玩着玩着,一会把自己难住了,一会又被自己难倒了,真是有趣诶!
小X出的题:
现在有N个不同的正整数,求它们可以组成多少个这样的集合,满足:
- 集合内的元素数量S>1
- 集合内任意两个数的差的绝对值都大于集合内的元素数量。
Input
第一行,一个正整数T(T<=20)表示数据组数。
对于每组数据,有两行。第一行为一个正整数N(3≤N≤25),第二行为N个用空格隔开的正整数xi(xi≤200)。
Output
对于每组数据,输出一行一个整数表示题中所描述的集合的个数。
Sample Input
152 3 5 8 1
Sample Output
6
Hint
{5,8},{1,5},{1,8},{2,5},{2,8},{3,8}.
解题思路(复制粘贴版):可以从第2开始枚举集合里的元素数目,在确定了元素数目之后dfs依次搜索第i个数,dfs过程中保证第i个数合法。
另外,不枚举集合内元素数目也是可以的,直接dfs依次枚举第i个数,当确定下一个数是否合法时,需要检查截止目前的最小相邻间隔是否大于目前集合内的元素数量。这一过程最好在dfs时记录并传递一个相邻间隔最小值。
代码:#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<vector>#include<stack>#include<bitset>#include<cstdlib>#include<cmath>#include<set>#include<list>#include<deque>#include<map>#include<queue>using namespace std;typedef long long ll;const double PI = acos(-1.0);const double eps = 1e-6;const int INF = 100000;const int maxn = 33;int a[maxn];int T,n,m;ll ans;void dfs(int num,int pos,int pre,int min_dif){ if(num>1&&min_dif>num) { ans++; //printf("num:%d pos:%d pre:%d ans:%d\n",num,pos,pre,ans); } if(pos==n) return; for(int i=pos;i<n;i++) { if(a[i]-pre>num+1) { dfs(num+1,i+1,a[i],min(min_dif,a[i]-pre)); } }}int main(){ scanf("%d",&T);while(T--) { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } ans=0; sort(a,a+n); dfs(0,0,-INF,INF); printf("%lld\n",ans); } return 0;}/**********************************************************************Problem: 1973User: 201601090128Language: C++Result: ACTime:296 msMemory:2020 kb**********************************************************************/
Description
小X学习了dfs,为了练习搜索,开始给自己出题玩。
玩着玩着,一会把自己难住了,一会又被自己难倒了,真是有趣诶!
小X出的题:
现在有N个不同的正整数,求它们可以组成多少个这样的集合,满足:
- 集合内的元素数量S>1
- 集合内任意两个数的差的绝对值都大于集合内的元素数量。
Input
第一行,一个正整数T(T<=20)表示数据组数。
对于每组数据,有两行。第一行为一个正整数N(3≤N≤25),第二行为N个用空格隔开的正整数xi(xi≤200)。
Output
对于每组数据,输出一行一个整数表示题中所描述的集合的个数。
Sample Input
152 3 5 8 1
Sample Output
6
Hint
{5,8},{1,5},{1,8},{2,5},{2,8},{3,8}.
解题思路(复制粘贴版):
可以从第2开始枚举集合里的元素数目,在确定了元素数目之后dfs依次搜索第i个数,dfs过程中保证第i个数合法。
另外,不枚举集合内元素数目也是可以的,直接dfs依次枚举第i个数,当确定下一个数是否合法时,需要检查截止目前的最小相邻间隔是否大于目前集合内的元素数量。这一过程最好在dfs时记录并传递一个相邻间隔最小值。
另外,不枚举集合内元素数目也是可以的,直接dfs依次枚举第i个数,当确定下一个数是否合法时,需要检查截止目前的最小相邻间隔是否大于目前集合内的元素数量。这一过程最好在dfs时记录并传递一个相邻间隔最小值。
代码:
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<vector>#include<stack>#include<bitset>#include<cstdlib>#include<cmath>#include<set>#include<list>#include<deque>#include<map>#include<queue>using namespace std;typedef long long ll;const double PI = acos(-1.0);const double eps = 1e-6;const int INF = 100000;const int maxn = 33;int a[maxn];int T,n,m;ll ans;void dfs(int num,int pos,int pre,int min_dif){ if(num>1&&min_dif>num) { ans++; //printf("num:%d pos:%d pre:%d ans:%d\n",num,pos,pre,ans); } if(pos==n) return; for(int i=pos;i<n;i++) { if(a[i]-pre>num+1) { dfs(num+1,i+1,a[i],min(min_dif,a[i]-pre)); } }}int main(){ scanf("%d",&T);while(T--) { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } ans=0; sort(a,a+n); dfs(0,0,-INF,INF); printf("%lld\n",ans); } return 0;}/**********************************************************************Problem: 1973User: 201601090128Language: C++Result: ACTime:296 msMemory:2020 kb**********************************************************************/
阅读全文
0 0
- csu D(1973): 给自己出题的小X
- CSU 1973:给自己出题的小X(DFS或DP)
- COJ1973-给自己出题的小X
- CSU1973: 给自己出题的小X
- 关于CSU 1725以及CodeForce 148D自己的解法
- [CSU 1802 小X的战斗力] 拓扑排序+Floyd
- 【2010集训队出题】小Z的袜子
- 给自己的小建议(持续更新)
- 给小叉(小X)的一封短信
- CSU 1350To Add Which? 给序列增加最少的值使得相邻数差<=D 优先队列+贪心
- 给自己"充电"小技巧
- cocos2d-x 一些需要记住的小知识d
- 小杂程序(给自己看的)
- 如何给自己的网站添加小图标
- 如何给自己的网站添加小图标
- 给eclipse换肤,自己的小窍门。
- 2017年给自己定下的小目标
- CSU 1799 小Z的黑白棋
- 汉诺塔问题
- Android判断软键盘弹出并隐藏的简单完美解决方法(推荐)
- Linux中用户与口令的管理
- 流:简单的压缩和解压流程
- 循环结构
- csu D(1973): 给自己出题的小X
- my eclipse 连接数据库(详细步骤)
- poj 2155(二维树状数组)
- CodeFroces 827B. High Load(构造法)
- ios-偏好设置浅析
- 机器学习和 数据分析的区别
- c语言单向链表的基本功能的实现
- (C++模板类)顺序表、双向链表
- ZOJ3541与时间相关的区间dp+记录路径