[HNOI2013]比赛

题目描述

沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛。此次联 赛共N支球队参加,比赛规则如下:

(1) 每两支球队之间踢一场比赛。 (2) 若平局,两支球队各得1分。

(3) 否则胜利的球队得3分,败者不得分。 尽管非常遗憾没有观赏到精彩的比赛,但沫沫通过新闻知道了每只球队的最后总得分, 然后聪明的她想计算出有多少种可能的比赛过程。

譬如有3支球队,每支球队最后均积3分,那么有两种可能的情况:

可能性1 可能性2

 球队  A  B  C  得分   球队 A  B  C  得分
A - 3 0 3 A - 0 3 3
B 0 - 3 3 B 3 - 0 3
C 3 0 - 3 C 0 3 - 3

但沫沫发现当球队较多时,计算工作量将非常大,所以这个任务就交给你了。请你计算 出可能的比赛过程的数目,由于答案可能很大,你只需要输出答案对10^9+7取模的结果

输入格式:

第一行是一个正整数N,表示一共有N支球队。 接下来一行N个非负整数,依次表示各队的最后总得分。 输入保证20%的数据满足N<=4,40%的数据满足N<=6,60%的数据满足N<=8,100%的数据 满足3<=N<=10且至少存在一组解。

输出格式:

仅包含一个整数,表示答案对10^9+7取模的结果

输入样例#1:

4

4 3 6 4

输出样例#1:

3

说明:

20%的数据满足N≤4;

40%的数据满足N≤6;

60%的数据满足N≤8;

100%的数据满足3≤N≤10且至少存在一组解。

solution:

因为数据范围小,且每一队分数不会大于27所以可以开个long long的map来进行记忆化。从第一队枚举,每枚举一对即可进行一次hash记忆化。注意一定要以每一队还需要的分数来hash不然会出错(性质不一样)(这样连样例都难过),还有hash之前排个序可以去重(快一些)(可以画图证明,枚举完一队后其他队所需分数可以互换)!

但因为是long long 的map速度不够优秀,所以剪枝很关键(暴力搜索,剪枝优秀的话可以60分)!

code:

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set> #define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int
#define mod 1000000007 using namespace std; int n,x,y,z;
int a[11],b[11],s[11]; map<ll,ll> h; inline int qr(){
char ch;
while((ch=getchar())<'0'||ch>'9');
int res=ch^48;
while((ch=getchar())>='0'&&ch<='9')
res=res*10+(ch^48);
return res;
} inline ll dfs(int i,int j){ll res=0;
if(a[i]-3*(n-j+1)>0)return 0;
if(j>n){
if(i==n-1)return 1;
for(rg k=i+1;k<=n;++k)
b[k]=a[k];
sort(b+i+1,b+n+1);
for(rg k=i+1;k<=n;++k)
res=res*27+b[k]+1;
if(h.find(res)!=h.end()){
return h[res];
}
return h[res]=dfs(i+1,i+2);
}
if(a[i]>2&&x){
a[i]-=3;--x;
res+=dfs(i,j+1);
a[i]+=3;++x;
}
if(a[j]>2&&x){
a[j]-=3;--x;
res+=dfs(i,j+1);
a[j]+=3;++x;
}
if(a[i]&&a[j]&&y){
--a[i];--a[j];--y;
res+=dfs(i,j+1);
++a[i];++a[j];++y;
}return res;
} int main(){
//freopen("match.in","r",stdin);
//freopen("match.out","w",stdout);
n=qr();
for(rg i=1;i<=n;++i)
z+=(s[i]=qr());
sort(s+1,s+n+1);
for(rg i=1;i<=n;++i)
a[i]=s[i];
x=z-n*n+n,y=(z-3*x)>>1;
printf("%lld\n",dfs(1,2)%mod);
return 0;
}

[HNOI2013]比赛 (用Hash实现记忆化搜索)的更多相关文章

  1. 【noip 2009】 乌龟棋 记忆化搜索&动规

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

  2. 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)

    心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起“唱” ...

  3. Codeforces Round #427 (Div. 2) Problem D Palindromic characteristics (Codeforces 835D) - 记忆化搜索

    Palindromic characteristics of string s with length |s| is a sequence of |s| integers, where k-th nu ...

  4. HDU 4597 Play Game (DP,记忆化搜索)

    Play Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total S ...

  5. UVa 10118 Free Candies (记忆化搜索+哈希)

    题意:有4堆糖果,每堆有n(最多40)个,有一个篮子,最多装5个糖果,我们每次只能从某一堆糖果里拿出一个糖果,如果篮子里有两个相同的糖果, 那么就可以把这两个(一对)糖果放进自己的口袋里,问最多能拿走 ...

  6. cdoj32-树上战争(Battle on the tree) 【记忆化搜索】

    http://acm.uestc.edu.cn/#/problem/show/32 树上战争(Battle on the tree) Time Limit: 12000/4000MS (Java/Ot ...

  7. HDU - 5001 Walk(概率dp+记忆化搜索)

    Walk I used to think I could be anything, but now I know that I couldn't do anything. So I started t ...

  8. ZOJ3352【记忆化搜索】

    先膜拜watashi! 前言: 比赛的时候,确定的是这是一个博弈,然后就是各种瞎猜,后面想到DP[ x ][ y ]代表x表白色的状态,y表黑色的状态,无果.挂机开始.GG.巨菜. 思路: 这一发记忆 ...

  9. hdu1978 简单记忆化搜索

    题意: How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...

随机推荐

  1. React Router学习

    React Router教程 本教程引用马伦老师的的教程 React项目的可用的路由库是React-Router,当然这也是官方支持的.它也分为: react-router 核心组件 react-ro ...

  2. Beta版本总结

    beta 阶段的 postmortem 报告 1. 每个成员在beta 阶段的实践和alpha 阶段有何改进? 成员  Beta阶段的实践和alpha 阶段有何改进  黄山成 beta阶段较alpha ...

  3. 05-java学习-循环结构

    for while do  while 增强for 各种循环嵌套.循环和if的嵌套.switch的嵌套

  4. ElasticSearch 2 (26) - 语言处理系列之打字或拼写错误

    ElasticSearch 2 (26) - 语言处理系列之打字或拼写错误 摘要 我们喜欢在对结构化数据(如:日期和价格)做查询时,结果只返回那些能精确匹配的文档.但是,好的全文搜索不应该有这样的限制 ...

  5. 从零开始学Kotlin-泛型(8)

    从零开始学Kotlin基础篇系列文章 与 Java 一样,Kotlin 也提供泛型,为类型安全提供保证,消除类型强转的烦恼. 泛型类的基本使用 泛型,即 "参数化类型",将类型参数 ...

  6. 从零开始学Kotlin-操作符(3)

    从零开始学Kotlin基础篇系列文章 冒号操作符 ":" 和 "::" :操作符用来定义变量.类的继承等 var name: String//定义变量 clas ...

  7. vis.js绘图库的一个BUG以及源码修正

    1. BUG 1.1 BUG触发情况 在使用vis.js绘图时,加入两个节点A和B之间既存在一条从A指向B的边,同时也存在一条从B指向A的边,那么这个绘图库就会崩溃. 1.2 BUG解析 vis.js ...

  8. 一日游 + 进度psp

    假设我们全班同学及教师去吉林省吉林市1日游,请为这次活动给出规格说明书. 目录 1   引言 1.1   编写目的 1.2   项目背景 1.3   参考资料 2   需求分析 2.1   交通方式 ...

  9. Win2008r2 设置 多用户同时远程

    Study From http://blog.sina.com.cn/s/blog_7ebe66420101tfln.html 1. 启动远程桌面,关闭防火墙 略过不提 2. 添加远程服务角色, 打开 ...

  10. Memcache 监控

    本文介绍zabbix.nagios.cacti对Memcache的监控 一:zabbix企业应用之固定端口监控memcache 一.在客户端 1.到/usr/loca/zabbix/conf/zabb ...