noip模擬賽4 Matrix67的派對 dfs

2022-05-01 17:18:08 字數 1980 閱讀 7989

描述

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 10216

610

輸出樣例 1

2

一開始的想法是列舉全排列 然後遍歷判斷

然後wa三個點

想到有可能有重複的數值 所以進行唯一化處理

最後還是wa乙個點

#includeusing

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

#define clr(a,v) memset(a,v,sizeof a)

/////////////////////////////////

/int

main()

int cnt=0

; sort(a+1,a+1+n);

double first=a[1

];

do

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

<

}

view code

更加簡便的方法  而且可以有效防止重複:  因為是小資料  直接搜尋即可

#includeusing

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

#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)

rep(i,

1,n)

if(!vis[i]&&abs(last-a[i])<=k)

return;}

intmain()

view code

NOIP模擬 matrix(簡化矩陣)

source noip2016 rzz 1 給出兩個 n n 的矩陣 a b,矩陣每行每列標號 0 n 1 定義這兩個矩陣的乘積 ab 為 現在要在這兩個矩陣上依次進行 q 次修改操作,兩種操作描述如下 在每一次修改操作進行後,輸出矩陣 ab 這兩個矩陣的乘積矩陣 中每個位置元素的權值之和。第一行,...

NOIP提高組模擬賽6

這題看著真熟啊,好像把之前的english,入陣曲雜糅了一下。首先,像入陣曲一樣計算出字首和 s 式子可以轉化為求 s r s l 1 equiv max mod k 像english一樣 用單調棧處理出以x為最大值的區間,分區間求解 每次列舉一側區間,已知max,只要知道另一側有多少與之餘數相同的...

NOIP提高組模擬賽4

丹青千秋釀,一醉解愁腸 無悔少年枉,只願壯志狂 矩陣字首和加暴力 o n 2m 2 60pts有手就行 觀察資料範圍,猜測應該是求一種 o n 3 的演算法,想到之前做的題,應該是 n 2 枚舉行,n 處理乙個序列的答案,然後,就沒有然後了 對於乙個序列,求子段和為k的倍數,如何 o n 求解,考慮...