描述
Matrix67发现身高接近的人似乎更合得来。Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排在圆桌上。Matrix67的安排原则是,圆桌上任意两个相邻人的身高之差不能超过K。请告诉Matrix67他共有多少种安排方法。
输入
第一行输入两个用空格隔开的数N和K,其中1<=N<=10,1<=K<=1 000 000。
第二行到第N+1行每行输入一个人的身高值。所有人的身高都是不超过1 000 000的正整数
输出
输出符合要求的安排总数
输入样例 1
4 10 2 16 6 10
输出样例 1
2
一开始的想法是枚举全排列 然后遍历判断
然后wa三个点
想到有可能有重复的数值 所以进行唯一化处理
最后还是wa一个点
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; //input #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define LL long long #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// int main() { int n,k; RII(n,k); double a[15]; rep(i,1,n) { scanf("%lf",&a[i]); a[i]=a[i]+i*0.00000000000001;// } int cnt=0; sort(a+1,a+1+n); double first=a[1]; do { int ok=1; rep(i,1,n-1) if(fabs(a[i]-a[i+1])-k>1e-12){ok=0;break;} if(fabs(a[1]-a[n])-k>1e-12 )ok=0; if(ok)cnt++; } while(next_permutation(a+1,a+1+n)&&a[1]==first); cout<<cnt; }
更加简便的方法 而且可以有效防止重复: 因为是小数据 直接搜索即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; //input #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define LL long long #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// int vis[15]; int first; int a[15]; int n,k,cnt; void dfs(int num,int last) { if(num==n&&abs(first-last)<=k) { cnt++; return; } rep(i,1,n) if(!vis[i]&&abs(last-a[i])<=k) { vis[i]=1; dfs(num+1,a[i]); vis[i]=0; } return; } int main() { RII(n,k); rep(i,1,n) RI(a[i]); cnt=0; CLR(vis,0); first=a[1]; vis[1]=1; dfs(1,a[1]); cout<<cnt; return 0; }