[HNOI2013]比赛 搜索
[HNOI2013]比赛
搜索。
直接暴力有60,考场上写的60,结果挂成40。
考虑在暴力的同时加个记忆化,把剩下的球队数和每支球队的得分情况hash一下,每次搜到还剩\(t\)个队的时候就在哈希表里找一下,有就拿来算答案,没有就把这次的结果存进哈希表。复杂度\(O(\)能过\()\)。
#include <cstdio>
#include <algorithm>
#include <unordered_map>
#define R register
#define I inline
#define L long long
using namespace std;
const int N = 13, B = 29, yyb = 1e9 + 7;
int a[N], b[N], f[N], sta[N], stp, n, t, k;
unordered_map <L, L> m;
I int cmp(int x, int y) { return x > y; }
L dfs(int x, int y) {
if (x == n)
return 1;
if (f[x] + (n - y + 1) * 3 < a[x])
return 0;
L o = 0;
if (y > n){
R int i;
for (i = x + 1; i <= n; ++i)
b[i] = a[i] - f[i];
sort(b + x + 1, b + n + 1);
for (i = x + 1; i <= n; ++i)
o = o * B + b[i];
if (m.find(o) != m.end())
return m[o];
else
return m[o] = dfs(x + 1, x + 2);
}
if (f[x] + 3 <= a[x] && k)
f[x] += 3, --k, o += dfs(x, y + 1), f[x] -= 3, ++k;
if (f[y] + 3 <= a[y] && k)
f[y] += 3, --k, o += dfs(x, y + 1), f[y] -= 3, ++k;
if (f[x] < a[x] && f[y] < a[y] && t)
++f[x], ++f[y], --t, o += dfs(x, y + 1), --f[x], --f[y], ++t;
return o % yyb;
}
int main() {
scanf("%d", &n), t = n * (n - 1) * 3 >> 1;
for (R int i = 1; i <= n; ++i)
scanf("%d", &a[i]), t -= a[i];
sort(a + 1, a + n + 1, cmp), k = (n * (n - 1) >> 1) - t, printf("%I64d", dfs(1, 2));
return 0;
}
[HNOI2013]比赛 搜索的更多相关文章
- [BZOJ3139][HNOI2013]比赛(搜索)
3139: [Hnoi2013]比赛 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1439 Solved: 719[Submit][Status] ...
- BZOJ.3139.[HNOI2013]比赛(搜索 Hash)
题目链接 不会搜索了.. DFS()中两个参数,枚举每两个队伍的比赛结果(分配当前队伍的分数). 可以发现方案数量与具体哪只球队得了多少分无关,只与当前比赛的队伍数量和得分序列的组成有关.可以记忆化搜 ...
- [luogu3230 HNOI2013] 比赛 (搜索+Hash)
传送门 Solution 搜索加Hash记录状态,记忆化搜索,需要注意顺序无关答案 Code //By Menteur_Hxy #include <map> #include <cm ...
- 【BZOJ3139】[HNOI2013]比赛(搜索)
[BZOJ3139][HNOI2013]比赛(搜索) 题面 BZOJ 洛谷 题解 双倍经验
- [HNOI2013]比赛 (用Hash实现记忆化搜索)
[HNOI2013]比赛 题目描述 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局, ...
- 【题解】HNOI2013比赛
[题解][P3230 HNOI2013]比赛 将得分的序列化成样例给的那种表格,发现一行和一列是同时确定的.这个表格之前是正方形的,后来长宽都减去一,还是正方形.问题形式是递归的.这就启示我们可以把这 ...
- BZOJ1306 [CQOI2009]match循环赛/BZOJ3139 [Hnoi2013]比赛[dfs剪枝+细节题]
地址 看数据范围很明显的搜索题,暴力dfs是枚举按顺序每一场比赛的胜败情况到底,合法就累计.$O(3^{n*(n-1)/2})$.n到10的时候比较大,考虑剪枝. 本人比较菜所以关键性的剪枝没想出来, ...
- BZOJ3139/BZOJ1306 HNOI2013比赛/CQOI2009循环赛(搜索)
搜索好难啊. 1.对于每个分数集合记忆化. 2.某人得分超过总分,剪枝. 3.某人之后全赢也无法达到总分,剪枝. 4.每有一场比赛分出胜负总分会多三分,而平局则会多两分.某人的分出胜负场次或平局场次超 ...
- [BZOJ3139][HNOI2013] 比赛
Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支球队各 ...
随机推荐
- winform messagebox自动关闭
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Laravel 实践之路: 数据库迁移与数据填充
数据库迁移实际上就是对数据库库表的结构变化做版本控制,之前对数据库库表结构做修改的方式比较原始,比如说对某张库表新增了一个字段,都是直接在库表中执行alter table xxx add .. 的方式 ...
- PHP安装posix、pctl扩展
安装问题 PHP Fatal error: Uncaught Error: Call to undefined function tsingsun\swoole\server\posix_kill() ...
- Mac Item2 设置别名 永久生效
使用 Item2 终端, 设置 别名的时候, 按照 网上的说法, 是 去 修改 用户目录下的 .bashrc 或者 .bash_profile 这两个文件都可以, 把 alias 写在 这两 ...
- 评微软收购GitHub
前段时间,微软正式宣布以75亿美元收购GitHub.除了微软和GitHub以外,也许对这笔并购最在意的,正是微软的同城敌友,亚马逊.在我看来,GitHub也许是微软史上最好的收购. 75亿美元贵不贵? ...
- Mysql数据库字符集问题
修改mysql数据库的默认编码方式 修改my.ini文件 加上 default-character-set=gb2312 设定数据库字符集 alter database da_name default ...
- 【转】Json判断是否存在某个属性和遍历各个属性和值
var field='uid'; var jsonObj={uid:'001'}; 一. jsonObj[field] != undefined //注意:如果field值正好是undefined那就 ...
- 在Ubuntu Desktop中安装软件
1. 安装好虚拟机后,可以先打开firefox,看是否可以访问外部的网页. 2. 如果在公司内网,可能访问不起,需要添加代理,确保可以访问外部的网页. 3. 更新软件源 sudo apt update ...
- 2016-3-19日小结:scrollTop
<div id="div1" style="padding: 0; position:absolute;width: 200px;height: 200px;< ...
- P4197 Peaks
题目描述 在Bytemountains有N座山峰,每座山峰有他的高度\(h_i\).有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点 ...