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

枚举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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值