题面

题解

\(n \leq 9 \to\)爆搜

对每一场的结果进行搜索,最后进行\(\mathrm{check}\)

然后会发现没有什么分

搜索最重要的就是剪枝

接下来就列出一些剪枝

  1. 搜索时,强制每个人的得分不超过总分

  2. 如果一个人赢了所有的比赛也达不到总分,就直接退出

  3. 设比赛的总分为\(s\_all\),分出胜负的有\(sx\)场,平局的有\(sy\)场,那么有:

    \(\begin{cases}3\times sx+2\times sy=sx\\sx+sy=\frac{n(n-1)}{2}\end{cases}\)

    然后就可以解出\(sx\)和\(sy\),然后就可以限制场数了。

加上了这些剪枝之后,大概有\(60\)分,接下来就要想一些其他的优化。

接下来我们发现人数为\(s\),得分集合为\(A\)的方案数是相同的。

于是记忆化一下,hash就可以了

代码

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<map>
#define RG register
#define file(x) freopen(#x".in", "r", stdin);freopen(#x".out", "w", stdout);
#define clear(x, y) memset(x, y, sizeof(x)) inline int read()
{
int data = 0, w = 1; char ch = getchar();
while(ch != '-' && (!isdigit(ch))) ch = getchar();
if(ch == '-') w = -1, ch = getchar();
while(isdigit(ch)) data = data * 10 + (ch ^ 48), ch = getchar();
return data * w;
} const int maxn(1010), Mod(1e9 + 7);
const unsigned long long X(31);
typedef unsigned long long ll; int n, a[maxn], s[maxn], r[maxn], all, p, q, ans;
std::map<ll, ll> f; using std::sort; inline void add(int &x, const int &y) { x += y; if(x >= Mod) x -= Mod; }
int dfs(int x, int y)
{
int ans = 0;
if(x == n) return 1;
if(a[x] + 3 * (n - y + 1) < s[x]) return 0;
if(y > n)
{
for(RG int i = x + 1; i <= n; i++) r[i] = s[i] - a[i];
sort(r + x + 1, r + n + 1);
ll ha = 0;
for(RG int i = x + 1; i <= n; i++) ha = ha * X + r[i];
if(f.find(ha) != f.end()) return f[ha];
else return f[ha] = dfs(x + 1, x + 2);
} if(a[x] + 3 <= s[x] && p)
a[x] += 3, --p, add(ans, dfs(x, y + 1)), a[x] -= 3, ++p;
if(a[x] + 1 <= s[x] && a[y] + 1 <= s[y] && q)
++a[x], ++a[y], --q, add(ans, dfs(x, y + 1)), --a[x], --a[y], ++q;
if(a[y] + 3 <= s[y] && p)
a[y] += 3, --p, add(ans, dfs(x, y + 1)), a[y] -= 3, ++p;
return ans;
} int main()
{
n = read();
for(RG int i = 1; i <= n; i++) all += (s[i] = read());
p = all - n * n + n; q = (all - 3 * p) >> 1;
sort(s + 1, s + n + 1, std::greater<int>());
printf("%d\n", dfs(1, 2));
return 0;
}

【HNOI2013】比赛的更多相关文章

  1. 【BZOJ3139】[HNOI2013]比赛(搜索)

    [BZOJ3139][HNOI2013]比赛(搜索) 题面 BZOJ 洛谷 题解 双倍经验

  2. [HNOI2013]比赛 (用Hash实现记忆化搜索)

    [HNOI2013]比赛 题目描述 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局, ...

  3. [HNOI2013]比赛 搜索

    [HNOI2013]比赛 搜索. LG传送门 直接暴力有60,考场上写的60,结果挂成40. 考虑在暴力的同时加个记忆化,把剩下的球队数和每支球队的得分情况hash一下,每次搜到还剩\(t\)个队的时 ...

  4. [BZOJ3139][HNOI2013]比赛(搜索)

    3139: [Hnoi2013]比赛 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1439  Solved: 719[Submit][Status] ...

  5. 【题解】HNOI2013比赛

    [题解][P3230 HNOI2013]比赛 将得分的序列化成样例给的那种表格,发现一行和一列是同时确定的.这个表格之前是正方形的,后来长宽都减去一,还是正方形.问题形式是递归的.这就启示我们可以把这 ...

  6. BZOJ1306 [CQOI2009]match循环赛/BZOJ3139 [Hnoi2013]比赛[dfs剪枝+细节题]

    地址 看数据范围很明显的搜索题,暴力dfs是枚举按顺序每一场比赛的胜败情况到底,合法就累计.$O(3^{n*(n-1)/2})$.n到10的时候比较大,考虑剪枝. 本人比较菜所以关键性的剪枝没想出来, ...

  7. [BZOJ3139][HNOI2013] 比赛

    Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下:  (1) 每两支球队之间踢一场比赛. (2) 若平局,两支球队各 ...

  8. 3139:[HNOI2013]比赛 - BZOJ

    题目描述 Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联赛共N只队伍参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支 ...

  9. bzoj 3139: [Hnoi2013]比赛

    Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支球队各得 ...

  10. [HNOI2013]比赛

    题目描述 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支球队各得1分. (3) ...

随机推荐

  1. 关于打开现有项目时数据库连接配置遇到的问题 连接字符串中的数据源值指定未安装的SQL Server的实例。要解决此问题,可选择安装匹配的SQL Server实例或修改连接字符串中的数据源值

    最近在看红皮书<ASP.NET MVC 5 高级编程>时,为了更好理解,边看书,边打开源代码查看,在VS(Visual Studio 2015)中将源代码打开,发现数据库连接是关闭的,本想 ...

  2. 转:iBatis简单入门教程

    iBatis 简介: iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快.如果不需要太多复杂的功能,iBatis 是能够满足 ...

  3. Linux crontab命令详解

    crontab:定时任务的守护进程,精确到分,设计秒的我们一般写脚本  -->相当于闹钟        日志文件:  ll /var/log/cron*        编辑文件: vim /et ...

  4. oracle 数据库数据备份

    oracle 数据库数据备份 1.使用oracle用户应该就可以进行数据备份(不需要root用户):su oracle 查oracle实例名:echo $ORACLE_SID       例如查出来的 ...

  5. maven项目中引入Jstl

    <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api& ...

  6. 绕过CDN查找网站真实IP方法收集

    方法1很简单,使用各种多地 ping 的服务,查看对应 IP 地址是否唯一,如果不唯一多半是使用了CDN, 多地 Ping 网站有: http://ping.chinaz.com/ http://pi ...

  7. CSS-定位属性

    Css学习——定位属性 定位可以看作是一种分层,通过对页面中的各种元素进行定位,可以将某些元素放到其他元素的上层,并在浏览器的窗口中设置这些元素的具体位置. position属性以及Css所提供的4中 ...

  8. [T-ARA][I'm so bad]

    歌词来源:http://music.163.com/#/song?id=22704433 作曲 : 김태현 , 조영수 [作曲 : k/gim-Tae-hyeon , c/jo-yeong-su] 作 ...

  9. vim高级操作命令

    1.首先在命令模式下,输入“:set nu”显示行号:通过行号确定你要删除的行:命令输入“:32,65d”,回车键,32-65行就被删除了,很快捷吧如果无意中删除错了,可以使用‘u’键恢复(命令模式下 ...

  10. javascript中的属性注意事项

    1.函数原型prototype设置的对象是只读类型,所以不能修改(即栈只读).但是我们常常可以看到它被“修改‘’了.若对象中定义的属性和原型中属性一样,优先使用自定义属性. 例如代码: //原型 类似 ...