CSU->1973: 給自己出題的小X

1973: 給自己出題的小X

            Time Limit: 1 Sec     Memory Limit: 128 Mb     

Description

小X學習了dfs,爲了練習搜索,開始給自己出題玩。
玩着玩着,一會把自己難住了,一會又被自己難倒了,真是有趣誒!
小X出的題:
現在有N個不同的正整數,求它們可以組成多少個這樣的集合,滿足:

集合內的元素數量S>1
集合內任意兩個數的差的絕對值都大於集合內的元素數量。

Input

第一行,一個正整數T(T<=20)表示數據組數。

對於每組數據,有兩行。第一行爲一個正整數N(3≤N≤25),第二行爲N個用空格隔開的正整數xi(xi≤200)。

Output

對於每組數據,輸出一行一個整數表示題中所描述的集合的個數。

Sample Input

1
5
2 3 5 8 1

Sample Output

6

Hint

{5,8},{1,5},{1,8},{2,5},{2,8},{3,8}.

Source

2017年7月月賽

題目鏈接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1973

題解:這道題,我剛開始看到時第一想到的是用動態規劃來解,想了很久之後,還是沒敲出來,後面看了別人的博客,才知道這題需要用個三維數組來解(如果是使用動態規劃),看了更多地是用DFS搜索來解更簡單易理解。如下是代碼:

AC代碼:

#include<iostream>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;

int a[30],cnt,T,n;
int last,i,min,sum;

void DFS(int last,int i,int sum,int min){
    if(i>=n||min<=sum){
        return ;
    }
    if(a[i]-a[last]>sum+1&&min>sum+1){
        cnt++;
        DFS(i,i+1,sum+1,min<a[i]-a[last]?min:a[i]-a[last]);
    }
    DFS(last,i+1,sum,min);
}

int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for(int j=0;j<n;j++){
            scanf("%d",&a[j]);
        }
        sort(a,a+n);
        cnt=0;
        for(int j=0;j<n-1;j++){
            DFS(j,j+1,1,INF);
        }
        printf("%d\n",cnt);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章