zoukankan      html  css  js  c++  java
  • 【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




  • 相关阅读:
    VBS修改本机的账号密码
    验证是否为全局编录服务器
    通过CMD命令设置网络参数
    VBS映射网络驱动器 映射网络驱动器
    命令提示符映射网络驱动器
    获得域内包括工作组内的所有计算机及其信息
    VirtualBox安装Redhat9.0
    启动和停止Oracle服务bat脚本
    Vim常用命令
    使用为知笔记客户端发布博客到【博客园】
  • 原文地址:https://www.cnblogs.com/bxd123/p/10553880.html
Copyright © 2011-2022 走看看