程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 4277 USACO ORZ (暴力搜索+set去重)

HDU 4277 USACO ORZ (暴力搜索+set去重)

編輯:C++入門知識

枚舉3^15種情況,不同的三角形用set去重。

先讓所有段加入一條邊,在逐個移動至另外兩邊,枚舉所有的情況

卡著時間過去的...........

 

include <cstdio>   
#include <cmath>   
#include <iostream>   
#include <algorithm>   
#include <cstring>   
#include <set>   
using namespace std;  
int a[22];  
int n;  
int sum,ans,flag;  
struct node {  
    int x,y,z;  
    bool operator < (const node &a) const {  
        if(a.x != x) return a.x < x;  
        if(a.y != y) return a.y < y;  
        return a.z < z;  
    }  
};  
  
set <node> s; //自定義set   
void init() {  
    s.clear();  
}  
  
void dfs(int v0,int v1,int v2,int i) {  
    if(i >= n) return ;  
    if(v0 + v1 > v2 && v0 + v2 > v1  && v1 + v2 > v0) {  
        int a1,a2,a3,tmp;  
        node t;  
        a1 = v0;  
        a2 = v1;  
        a3 = v2;  
        if (a2 > a3) {  
            swap(a2,a3);  
        }  
        if (a1 > a2) {  
            swap(a1,a2);  
        }  
        if (a2 > a3) {  
            swap(a2,a3);  
        }  
        t.x = a1;  
        t.y = a2;  
        t.z = a3;  
        s.insert(t);  
    }  
    //每個i,三種選擇   
    if(v0 + v1 - a[i] > v2 + a[i]) dfs(v0 - a[i],v1,v2 + a[i] ,i+1);  
    if(v0 + v2 - a[i] > v1 + a[i]) dfs(v0 - a[i],v1 + a[i],v2, i+1);  
    dfs(v0,v1,v2,i+1);  
}  
  
int main() {  
    int T;  
    cin >> T;  
    while(T --) {  
        init();  
        scanf("%d",&n);  
        sum = 0;  
        for(int i=0; i<n; i++) {  
            scanf("%d",&a[i]);  
            sum += a[i];  
        }  
        dfs(sum,0,0,0);  
        printf("%d\n",s.size());  
    }  
    return 0;  
}  

#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <set>
using namespace std;
int a[22];
int n;
int sum,ans,flag;
struct node {
    int x,y,z;
    bool operator < (const node &a) const {
        if(a.x != x) return a.x < x;
        if(a.y != y) return a.y < y;
        return a.z < z;
    }
};

set <node> s; //自定義set
void init() {
    s.clear();
}

void dfs(int v0,int v1,int v2,int i) {
    if(i >= n) return ;
    if(v0 + v1 > v2 && v0 + v2 > v1  && v1 + v2 > v0) {
        int a1,a2,a3,tmp;
        node t;
        a1 = v0;
        a2 = v1;
        a3 = v2;
        if (a2 > a3) {
            swap(a2,a3);
        }
        if (a1 > a2) {
            swap(a1,a2);
        }
        if (a2 > a3) {
            swap(a2,a3);
        }
        t.x = a1;
        t.y = a2;
        t.z = a3;
        s.insert(t);
    }
    //每個i,三種選擇
    if(v0 + v1 - a[i] > v2 + a[i]) dfs(v0 - a[i],v1,v2 + a[i] ,i+1);
    if(v0 + v2 - a[i] > v1 + a[i]) dfs(v0 - a[i],v1 + a[i],v2, i+1);
    dfs(v0,v1,v2,i+1);
}

int main() {
    int T;
    cin >> T;
    while(T --) {
        init();
        scanf("%d",&n);
        sum = 0;
        for(int i=0; i<n; i++) {
            scanf("%d",&a[i]);
            sum += a[i];
        }
        dfs(sum,0,0,0);
        printf("%d\n",s.size());
    }
    return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved