hdu 4277

来源:互联网 发布:unity3d 添加模型 编辑:程序博客网 时间:2024/06/05 16:17

题意:

给你N个长度的木棍,这些木棍都要用上组成三条边,并能构成三角形,问这样所构成的三角形有多少个不同。


解题思路:

因为N<=15,所以尝试了一下暴搜,在判断三角形是否存在重复时,规定的三边的大小顺序,然后构造hash,判重。刚开始T了,后来不断贱贱贱枝,终于AC了

注意:

剪枝,和hash的构造。

#include <string.h>#include <stdlib.h>#include <stdio.h>#include <vector>#include <math.h>#include <algorithm>using namespace std;#define MAXN 1000013#define Mod 1000003typedef struct node{    int a,b,c;    node(){            }    node(int aa,int bb,int cc){        a = aa;        b = bb;        c = cc;    }    bool equal(int aa,int bb,int cc){        if(aa==a&&bb==b&&cc==c)return true;        return false;    }};int hashind[MAXN],li[20],cnt;vector<node>vt[MAXN];bool vis[MAXN];int sum=0,ans;inline unsigned int BKDRHash(int a,int b,int c){    unsigned  int seed = 31; // 31 131 1313 13131  etc..    unsigned  int hash = 0;        //    while (*str)    //    {    //        hash = hash * seed + (*str++);    //    }        hash = hash*seed+c;    hash = hash*seed+b;    hash = hash*seed+a;    return (hash & 0x7FFFFFFF);}bool isTrag(int a,int b,int c){    if(a+b>c)return true;    return false;}void swap(int &a,int &b,int &c){    int tmp;    if(a>b){        tmp = a;        a = b;        b = tmp;    }    if(a>c){        tmp = a;        a = c;        c = tmp;    }    if(b>c){        tmp = b;        b = c;        c = tmp;    }    //    int aa[3];    //    aa[0] = a;    //    aa[1] = b;    //    aa[2] = c;    //    sort(aa,aa+3);    //    a  = aa[0];    //    b  =  aa[1];    //    c  =  aa[2];}int Hash(int a,int b,int c){    return (c*17+b*13+a*11);}bool hashit(int a,int b,int c){    //     char str0[100],str1[100],str2[100];    ////     sprintf(str0,"%d",c);    ////    sprintf(str1,"%d",b);    ////    sprintf(str2, "%d",a);    //    //sprintf(str0,str1,str2,"%s%s%s",a,b,c);    //     strcat(str0, str1);    //    strcat(str0, str2);    int hashnum = BKDRHash(a,b,c);    hashnum%=Mod;    if(!vis[hashnum]){        hashind[cnt++] = hashnum;        vis[hashnum] = true;    }    for(int i=0;i<vt[hashnum].size();++i){        if(vt[hashnum][i].equal(a, b, c))            return true;    }    vt[hashnum].push_back(node(a,b,c));    return false;}void Trag(int a,int b,int c){    if(a<=0||b<=0||c<=0)return;    //swap(a,b,c);    if(isTrag(a, b, c)){        if(!hashit(a, b, c)){            ++ans;        }    }    return;}void dfs(int ind,int indup,int sum1,int sum2,int sum3){    //Trag(sum1, sum2, sum - sum1 - sum2);        if(ind==indup){        if(sum1<=sum2&&sum2<=sum3)            Trag(sum1, sum2, sum3);        return ;    }    dfs(ind+1,indup,sum1+li[ind],sum2,sum3);    dfs(ind+1,indup,sum1,sum2+li[ind],sum3);    dfs(ind+1,indup,sum1,sum2,sum3+li[ind]);    }void solve(int N){    sort(li,li+N);    // int ans = 0;    dfs(0,N,0,0,0);    //dfs(0,N,0,li[0]);    printf("%d\n",ans);}void clear(){    for(int i=0;i<cnt;++i){        if(vt[hashind[i]].size()){            vt[hashind[i]].clear();        }    }}int main() {    int N,T;        // scanf("%d",&T);    //        for(int i=1000000;;i++){    //            bool flag = true;    //            for(int j=2;j<=sqrt(i*1.0);j++){    //                if(i%j==0){    //                    flag = false;    //                    break;    //                }    //            }    //            if(flag){    //                printf("%d\n",i);    //                break;    //            }    //        }    scanf("%d",&T);    while(T--){        memset(vis,false,sizeof(vis));        scanf("%d",&N);        sum=0;        cnt = 0;        ans=0;        for(int i=0;i<N;++i){            scanf("%d",&li[i]);            sum+=li[i];        }        solve(N);        clear();    }    return 0;}


0 0
原创粉丝点击