计蒜客 身高接近

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计蒜客 身高接近相关的知识,希望对你有一定的参考价值。

Matrix67发现身高接近的人似乎更合得来。Matrix67举办的派对共有N(1< =N< =10)个人参加,Matrix67需要把他们安排在圆桌上。Matrix67的安排原则是,圆桌上任意两个相邻人的身高之差不能超过K。请告诉Matrix67他共有多少种安排方法。

输入格式:

第一行输入两个用空格隔开的数NK,其中1< =N< =101< =K< =1? 000? 000。第二行到第N+1行每行输入一个人的身高值。所有人的身高都是不超过1? 000? 000的正整数

输出格式:

输出符合要求的安排总数

样例1

输入:

4 10

2

16

6

10

输出:

2

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define N 11
  4. #define abs(a) ((a)>=0?(a):(-(a)))
  5. int a[N];
  6. int vis[N];//标志数组表示某个人是否已加入圆桌
  7. int res=0,k,n;
  8. void dfs(int cur,int use){
  9. ????if(use==n){
  10. ????????if(abs(a[cur]-a[0])<=k)
  11. ????????????res++;//记录结果,当出现符合题意环序列,结果+1
  12. ????????return ;
  13. ????}
  14. ????int i;
  15. ????vis[cur]=1;
  16. ????for(i=0;i<n;i++){
  17. ????????if(vis[i]==0&&abs(a[cur]-a[i])<=k){//在未加入人群中选取与当前人身高差符合的加入
  18. ????????????dfs(i,use+1);
  19. ????????????vis[i]=0;
  20. ????????}
  21. ????}
  22. }
  23. int main(){
  24. ????int i;
  25. ????scanf("%d%d",&n,&k);
  26. ????for(i=0;i<n;i++)scanf("%d",&a[i]);
  27. ????memset(vis,0,sizeof(vis));
  28. ????dfs(0,1);
  29. ????printf("%d",res);
  30. }

Dfs方式的枚举,或者说搜索,类似于全排列生成的算法,对于这类从一个集合中选取符合条件的排列的问题都可以用这种方式做,如果我们用一个数组来记录,在res++的地方,我们甚至可以字典序打印出排列,但这题没要求,所以简单了好多,但这题比较特别的一点在于是环排列,一开始不用脑,直接撸dfs,然后发现是环(圆桌),就被吓到 了,以为要记录结果什么的,排列问题的解都是阶乘这种怪物,觉得根本不现实,冷静下来想想发现,只要把开头固定住,就不会出现重复环,因为开头固定了,问题就变成非环排列问题,但是对首尾的值(身高)有要求,这样就得出 了以某个元素为开头,可能出现的解。然后还有一个特别的点就是,以一个元素为开头形成的环,总可以通过以其他元素为开头形成的环旋转得到,或者说任意一个环我们可以把任何一个元素当开头,于是这道题的解法就是任选一个数做开头(这里为了方便我们以a[0]做开头,其实可以任选0~n-1的元素做开头,结果也是正确的),然后对其进行合理排列枚举(这里我们以dfs的方法,用题设条件加以限制),每得到一个长度为n的合理排列,就将res+1,直至枚举完,就得到结果 。最后还要说一点,如果对a数组进行字典序排序,这里我们也可以打印出字典序方案。

总结:dfs的使用要用到递归,这使得它的代码实现起来往往很简洁,但是因为递归先天自带爆栈漏洞,一般不能处理大数据,dfs可能目前我掌握得比较好的一块了,最近做了几道题都挺轻松的,也有可能只是题目水,昨天想要去了解下KMP算法相关的知识,找了道题,看了下文章,结果又长又晦涩,看到心累了,想去放松下,结果刷了一下午的知乎。。。,晚上想陪老妈看一下电视,然后就进去继续看,结果那电视剧出乎意料地好看,最后昨天啥也没干,连单词都没背--__--!!,今天早上又被老妈叫去大扫除,好不容易有机会遛回来,想继续看那KMP,结果,最后还是放弃了,还是脚踏实地的好,晚上默默地刷起了大数,临睡前觉得今天应该写下解题报告,就把这题翻出来写,其实这题那么水,我都不好意思写,我的主要目的是这里的做题总结

(总结你妹啊,一大半都和题目无关,完全是你的个人流水账好不好!),我觉得以后应该把精力放在自己的薄弱环节,比如我的大数一直都是靠模板,dfs挺熟的了,但bfs完全没做过题,数论题和博弈论题自动忽略,老是做自己会的题是不行的,人要多虐自己才是对的,而且自己也进入瓶颈期了,有要抱起那本白书了,话说 C++prime这两天一直没翻过呢,好担心自己能不能在寒假结束前翻完。总之,尽量挤时间吧。

以上是关于计蒜客 身高接近的主要内容,如果未能解决你的问题,请参考以下文章

计蒜客 爬楼梯

计蒜客 求偶数和

计蒜客---线段的总长

计蒜客 挑战难题 爬楼梯

[计蒜客] ACM-ICPC 2018 南京赛区网络预赛 | 部分题解 | 线段树 + 线性筛 + 最短路

计蒜客 单独的数字