hdu 4277 USACO ORZ (dfs暴搜+hash)
题目大意:有N个木棒,相互组合拼接,能组成多少种不同的三角形。
思路:假设c>=b>=a 然后枚举C,在C的dfs里嵌套枚举B的DFS。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define mod 2000007
using namespace std; int n;
int X[20];
bool vis[20];
int ans;
long long sum; long long hash[mod]; bool ok(int b,int c)
{
int a=sum-b-c;
if(a+b>c && c>=b && b>=a)return true; return false;
} bool work(long long t)
{
int v=t%mod; while(hash[v]!=t && hash[v]!=-1)//.....之前这里写成了IF 卡了半天再找到。以后要细心。。。
v=(v+10)%mod; if(hash[v]==-1)
{
hash[v]=t;
return true;
}
return false;
} void dfsb(int pos,int c,int b)
{
//printf("c = %d b = %d\n",c,b);
for(int i=pos;i<=n;i++)
{
if(vis[i])continue; vis[i]=true;
b+=X[i]; if(ok(b,c))
{
//printf("c = %d,b = %d,a = %d\n",c,b,sum-b-c);
int a=sum-b-c;
long long t=(long long)a+(long long)b*sum+(long long)c*sum*sum;
if(work(t))ans++;
}
if(b<=c)dfsb(i,c,b); b-=X[i];
vis[i]=false;
}
} void dfsc(int pos,int c)
{
for(int i=pos;i<=n;i++)
{
if(vis[i])continue; vis[i]=true;
c+=X[i]; if(c>=sum/3 && c<=sum/2)dfsb(1,c,0);//剪枝 dfsc(i,c); c-=X[i];
vis[i]=false;
}
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n); memset(vis,0,sizeof(vis));
memset(hash,-1,sizeof(hash)); sum=0; for(int i=1;i<=n;i++)
{
scanf("%d",&X[i]);
sum+=X[i];
}
ans=0;
dfsc(1,0);
printf("%d\n",ans);
}
return 0;
}
hdu 4277 USACO ORZ (dfs暴搜+hash)的更多相关文章
- hdu 4277 USACO ORZ dfs+hash
USACO ORZ Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Proble ...
- hdu 4277 USACO ORZ DFS
USACO ORZ Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU 4277 USACO ORZ(DFS暴搜+set去重)
原题代号:HDU 4277 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4277 原题描述: USACO ORZ Time Limit: 5000/1 ...
- HDU 4277 USACO ORZ(暴力+双向枚举)
USACO ORZ Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 4277 USACO ORZ(dfs+剪枝)
Problem Description Like everyone, cows enjoy variety. Their current fancy is new shapes for pasture ...
- hdu 4277 USACO ORZ (Dfs)
题意: 给你n个数,要你用光所有数字组成一个三角形,问能组成多少种不同的三角形 时间分析: 3^15左右 #include<stdio.h> #include<set> usi ...
- hdu 4277 USACO ORZ
没什么好方法,只能用dfs了. 代码如下: #include<iostream> #include<cstring> #include<cstdio> #inclu ...
- HDU 4284 Travel (Folyd预处理+dfs暴搜)
题意:给你一些N个点,M条边,走每条边要花费金钱,然后给出其中必须访问的点,在这些点可以打工,但是需要先拿到证书,只可以打一次,也可以选择不打工之直接经过它.一个人从1号点出发,给出初始金钱,问你能不 ...
- Usaco 2.3 Zero Sums(回溯DFS)--暴搜
Zero SumConsider the sequence of digits from 1 through N (where N=9) in increasing order: 1 2 3 ... ...
随机推荐
- Linux常用命令3--如何设置IP地址?如何更改系统时间?
Linux常用命令 系统状态监控 [1]ps:用于显示当前系统中运行的进程. 语法:ps [-option]:常用的参数有:-a;-u;-x;-e;-f. -a:显示所有进程: -u:显示所有用户: ...
- 通讯录C++console application
#include<iostream> #include<fstream> #include<string> #include<cstring> #inc ...
- sql server 辅助工具
sql Prompt 智能感知, 也是需要注册机. 效果如图: 这里最好改下:
- exit() _exit()
图 C程序的启动与终止 差别: _exit()函数:直接使进程停止执行,清除其使用的内存空间,并销毁其在内核中的各种数据结构; exit()函 数则在这些基础上作了一些包装,在运行退出之前加了若干道工 ...
- DEDECMS织梦常用二开自定义标签
网站名称:{dede:global.cfg_webname/} 网站根网址:{dede:global.cfg_basehost/} 网站根目录:{dede:global.cfg_cmsurl/} 网页 ...
- jq toggle1.9版本后不支持解决方案
<script type="text/javascript"> $(document).ready(function(){ $("button"). ...
- 【hoj】2651 pie 二分查找
二分查找是一个非常主要的算法,针对的是有序的数列,通过中间值的大小来推断接下来查找的是左半段还是右半段,直到中间值的大小等于要找到的数时或者中间值满足一定的条件就返回,所以当有些问题要求在一定范围内找 ...
- intellij idea 13&14 插件推荐及快速上手建议 (已更新!)
原文:intellij idea 13&14 插件推荐及快速上手建议 (已更新!) 早些年 在外企的时候,公司用的是intellij idea ,当时也是从eclipse.MyEclipse转 ...
- linuxsocket通信recv研究缓存机制
曾有过这样一个小疑问.当一个进程注册的插座后,,假设插座没有被调用recv函数接受包.能接受到数据包吗? 或者这样说,假设我的程序注冊了一个套接字去接受数据包,可是每收到一个数据包都须要非常长 ...
- 让你的ubuntu串口程序可以直接读写串口
默认的情况下,如果我们使用一般用户去打开串口的话会出现 open failed 的错误 这个时候你可以在执行打开串口时加一个sudo,但每次这么需要这么干实在是太麻烦了. 这有一个方法可以跳过以超级用 ...