1306: [CQOI2009]match循环赛
2017-10-25 21:26
344 查看
题目链接
题目大意:循环赛,给出所有队伍的最终得分,求方案数
题解:n只队伍共n*(n-1)/2场比赛,理论复杂度为28^3,显然不科学
玄学剪枝
1.若x的目前得分超过最终得分则剪枝
2.若x剩余比赛全胜也无法达到最终得分则剪枝
3.用最终得分-目前得分直接计算出x最后一场比赛的应得分,看上去没什么用,但是由于搜索树最后一层节点最多,实际效果不错
我的收获:剪枝大法
题目大意:循环赛,给出所有队伍的最终得分,求方案数
题解:n只队伍共n*(n-1)/2场比赛,理论复杂度为28^3,显然不科学
玄学剪枝
1.若x的目前得分超过最终得分则剪枝
2.若x剩余比赛全胜也无法达到最终得分则剪枝
3.用最终得分-目前得分直接计算出x最后一场比赛的应得分,看上去没什么用,但是由于搜索树最后一层节点最多,实际效果不错
我的收获:剪枝大法
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int M=11; const int f[]={3,1,0,0}; int n,result[M],has[M],str[M]; int ans; void dfs(int x,int y) { if(has[x]>result[x]) return ; if(has[x]+3*(n-y+1)<result[x]) return ; if(x==n){ans++;return ;} if(y==n) { int need=result[x]-has[x]; if(need==2) return ; has[y]+=f[need]; dfs(x+1,str[x+1]); has[y]-=f[need]; } else{ has[x]+=3,dfs(x,y+1),has[x]-=3; has[y]+=3,dfs(x,y+1),has[y]-=3; has[x]+=1,has[y]+=1,dfs(x,y+1),has[x]-=1,has[y]-=1; } } void work() { dfs(1,str[1]); cout<<ans<<endl; } void init() { cin>>n; for( 4000 int i=1;i<=n;i++) cin>>result[i]; for(int i=1;i<=n;i++) str[i]=i+1; } int main() { init(); work(); return 0; }
相关文章推荐
- BZOJ 1306: [CQOI2009]match循环赛
- bzoj 1306 [CQOI2009]match循环赛
- bzoj 1306: [CQOI2009]match循环赛【dfs+剪枝】
- BZOJ 1306: [CQOI2009]match循环赛 爆搜,剪枝
- 【搜索】【剪枝】bzoj1306 [CQOI2009]match循环赛
- bzoj1306: [CQOI2009]match循环赛
- 【BZOJ】【P1306】【CQOI2009】【match循环赛】【题解】【搜索+剪枝】
- [CQOI2009]match循环赛
- BZOJ P1306 [CQOI2009]match循环赛
- BZOJ 1306 match循环赛(搜索)
- [CQOI2009] 循环赛 - 暴力出奇迹
- bzoj 1306 match循环赛
- BZOJ3139/BZOJ1306 HNOI2013比赛/CQOI2009循环赛(搜索)
- 【二分+最大流】BZOJ1305 [CQOI2009]dance跳舞
- [CQOI2009]dance跳舞
- luogu3153&&bzoj1305 [CQOI2009]DANCE跳舞
- [BZOJ1303]CQOI2009中位数图|乘法原理|前缀和
- AC日记——[CQOI2009]DANCE跳舞 洛谷 P3153
- [BZOJ1303][CQOI2009]中位数图
- 1304: [CQOI2009]叶子的染色