首页 > 代码库 > XidianOJ 1095 派对
XidianOJ 1095 派对
题目描述
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的正整数
第二行到第N+1行每行输入一个人的身高值。所有人的身高都是不超过1 000 000的正整数
输出
输出符合要求的安排总数
--正文
N非常小,直接一个一个摆过去试试就好
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int height[11]; int visit[11]; int table[11]; int n,k; int res = 0; int my_abs(int a){ if (a<0) return -a; return a; } bool canPos(int i,int height){ if (i == 1) return true; if (i == n){ if ( my_abs(height-table[i-1]) <= k && my_abs(height - table[1]) <= k){ return true; } else return false; } else if (my_abs(height-table[i-1]) <= k){ return true; } else return false; } void pos(int now){ int i; if (now == n+1) { // for (i=1;i<=n;i++){ // printf("%d ",table[i]); // } printf("\n"); res ++; return; } for (i=1;i<=n;i++){ // if (now==1 && table[1] = 16){ // printf("HERE!\n"); // } // if (table[1] == 16 && table[2] == 6 && table[3] == 2){ // printf("HERE!\n"); // } if (!visit[i] && canPos(now,height[i])){ table[now] = height[i]; visit[i] = 1; pos(now+1); table[now] = 0; visit[i] = 0; } } } int main(){ while (scanf("%d %d",&n,&k) != EOF){ int i; res = 0; memset(visit,0,sizeof(visit)); memset(table,0,sizeof(table)); for (i=1;i<=n;i++) scanf("%d",&height[i]); pos(1); printf("%d\n",res/n); } return 0; }
XidianOJ 1095 派对
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。