1306: [CQOI2009]match循环赛
来源:互联网 发布:淘宝详情页视频下载 编辑:程序博客网 时间:2024/05/18 20:53
题目链接
题目大意:循环赛,给出所有队伍的最终得分,求方案数
题解: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(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;}
阅读全文
0 0
- 1306: [CQOI2009]match循环赛
- BZOJ 1306: [CQOI2009]match循环赛
- bzoj 1306 [CQOI2009]match循环赛
- BZOJ 1306: [CQOI2009]match循环赛 爆搜,剪枝
- bzoj1306: [CQOI2009]match循环赛
- bzoj1306 [CQOI2009]match循环赛
- BZOJ P1306 [CQOI2009]match循环赛
- 【BZOJ】【P1306】【CQOI2009】【match循环赛】【题解】【搜索+剪枝】
- [CQOI2009] 循环赛 - 暴力出奇迹
- JZOJ 4.15 1110——CQOI2009循环赛【dfs】【hash判重】
- 循环赛
- 【CQOI2009】跳舞
- 【CQOI2009】中位数
- CQOI2009中位数
- 循环赛问题
- 循环赛算法
- 循环赛日程表
- 循环赛日程表
- Mvp购物车
- 景驰无人驾驶 1024 编程邀请赛 A.热爱工作的蒜蒜(最短路,SPFA)
- Java NIO系列教程(4):Scatter/Gather
- 机器学习介绍
- Git回退方法
- 1306: [CQOI2009]match循环赛
- Java基础之接口与抽象类的区别
- 文件管理
- g++编译
- HTTP服务器可以响应POST请求,并能响应注册信息
- Ubuntu 16.04 中安装谷歌 Chrome 浏览器
- 注册页面
- BZOJ 3193 [JLOI 2013] 计数DP 解题报告
- leetcode题解-410. Split Array Largest Sum