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
- HDU 4277
- hdu 4277
- hdu 4277
- HDU 4277 USACO ORZ
- HDU 4277 - USACO ORZ
- hdu 4277 USACO ORZ
- HDU 4277 USACO ORZ
- HDU 4277 USACO ORZ
- HDU 4277 USACO ORZ
- hdu 4277 USACO ORZ
- hdu 4277 暴力+set
- HDU-4277 USACO ORZ
- hdu 4277 USACO ORZ
- hdu
- hdu
- HDU
- hdu ()
- hdu
- 在字符串中找出连续最常的字符串,并把这个串的长度返回。
- 对android.jar开展反编译获得其资源文件
- 性能测试之性能测试定义与过程
- Fragment 网络数据请求最好放在setUserVisibleHint中
- JqueryMobile链接一个页面,而链接页面中图片需刷新才显示的问题
- hdu 4277
- Linux目录结构
- leetcode-Distinct Subsequences
- hdu 1548 A strange lift
- 错误集锦7
- 我的个性Sublime Text 3
- 搭建Ubuntu下c/c++ 和 java jdk 编译环境
- Android Fragment 嵌套使用(Nested Fragments)
- nginx.conf 配置文件中文说明