【noip模拟赛4】Matrix67的派对 dfs

描述

 

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一个点
#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;
}
View Code

更加简便的方法  而且可以有效防止重复:  因为是小数据  直接搜索即可

#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;
}
View Code




猜你喜欢

转载自www.cnblogs.com/bxd123/p/10553880.html
dfs