题目链接

戳我

\(Solution\)

这道题观察数据范围发现很小,再看看题目可以发现是搜索.

这题纯搜索会\(T\)所以要加入适当剪枝

  • 如果一个人后面的比赛都赢却依旧到不了目标分数,则直接\(return\)
  • 限制每个人的分数,使他的分数不超过目标分数
  • 我们用\(fx\)当做分出胜负的场次,\(fy\)当做平的场,ans当做总分数.则可以列出如下方程:

\[ \left\{
\begin{array}
fx+fy=n*(n-1)/2\\
3*fx+2*fy=ans \
\end{array}
\right.
\]

上面明显是一个二元一次方程组,可以将\(fx\)和\(fy\)解出来,这样子就可以用\(fx\)和\(fy\)限制胜负的场次和平的场次

  • 利用的是人数为\(X\),分数集合为\(A\)的比赛方案数一定,与某人详细的得分是没有关系的.所以可以用记搜.把最后几个人剩余的分数的方案数存下就好了

\(Code\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7;
int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
map<int,int> hah;
int aim[20],now[20],fx,fy,ans,b[11],n,m,js;
int dfs(int x,int y){
if(x==n) return 1;
if((n-y+1)*3<aim[x]-now[x]) return 0;
if(y==n+1){
for(int i=x+1;i<=n;i++)
b[i]=aim[i]-now[i];
sort(b+x+1,b+1+n),ans=0;
for(int i=x+1;i<=n;i++)
ans=ans*28+b[i];
if(hah.find(ans)!=hah.end()) return hah[ans];
else return hah[ans]=dfs(x+1,x+2);
}
int res=0;
if(now[x]+2<aim[x]&&fx)
now[x]+=3,fx--,res+=dfs(x,y+1),now[x]-=3,fx++;
if(now[x]<aim[x]&&now[y]<aim[y]&&fy)
now[x]++,now[y]++,fy--,res+=dfs(x,y+1),now[x]--,now[y]--,fy++;
if(now[y]+2<aim[y]&&fx)
now[y]+=3,fx--,res+=dfs(x,y+1),now[y]-=3,fx++;
return res%mod;
}
main(){
n=read(),m=n*(n-1);
for(int i=1;i<=n;i++)
aim[i]=read(),js+=aim[i];
sort(aim+1,aim+1+n);
fx=js-m,fy=(m-2*fx)>>1;
printf("%lld",dfs(1,2)%mod);
}

「HNOI 2013」比赛的更多相关文章

  1. 「HNOI 2013」游走

    题目链接 戳我 \(Solution\) 首先申明几个变量: f[x]:到点x的概率, vis[x]:x点的度 dp[x][y]:(x,y)这条边的概率 number[x][y]:x这条边的编号 下面 ...

  2. 「HNOI 2013」消毒

    题目链接 戳我 \(Solution\) 我们首先想一想如果这一题只是二维的该怎么办? 就是一个最小点覆盖问题.这里就不详细解释了,用网络流或匈牙利都无所谓. 但现在是三维的,那么现在该如何处理呢? ...

  3. 「HNOI 2013」数列

    题目链接 戳我 \(Solution\) 这道题貌似并不难的样子\(QAQ\) 我们发现这个因为有首项的关系所以有点不太好弄.所以我们要将这个首项对答案的影响给去掉. 我们可以构建一个差分数组,我们令 ...

  4. LOJ#3054. 「HNOI 2019」鱼

    LOJ#3054. 「HNOI 2019」鱼 https://loj.ac/problem/3054 题意 平面上有n个点,问能组成几个六个点的鱼.(n<=1000) 分析 鱼题,劲啊. 容易想 ...

  5. 「HNOI 2019」白兔之舞

    一道清真的数论题 LOJ #3058 Luogu P5293 题解 考虑$ n=1$的时候怎么做 设$ s$为转移的方案数 设答案多项式为$\sum\limits_{i=0}^L (sx)^i\bin ...

  6. 「HNOI 2016」 序列

    \(Description\) 给你一个序列,每次询问一个区间,求其所有子区间的最小值之和 \(Solution\) 这里要用莫队算法 首先令\(val\)数组为原序列 我们考虑怎么由一个区间\([l ...

  7. 「HNOI 2015」实验比较

    \(Description\) 有\(n\)个元素,对于每个元素\(x_i\)最多知道一个形如\(x_j < x_i\)或\(x_j=x_i\)的条件,问有多少合法的序列.合法的序列满足每个元素 ...

  8. 「HNOI 2014」 江南乐

    \(Description\) \(n\)堆石子,每堆石子有\(s_i\)个,两个人轮流操作,每次可以将一对不少于\(F\)的石子尽量平均分成\(m\)堆,\(m\)每次自选,不能操作者输.共有\(T ...

  9. 「HNOI 2015」亚瑟王

    \(Description\) 有\(n\)张卡牌,每一张卡牌有\(p_i\)的概率发动,并造成\(d_i\)点伤害.一共有\(r\)轮,每一轮按照编号从小到大依次考虑,如果这张牌已经发动过则跳过该牌 ...

随机推荐

  1. Make 命令教程(转载)

    代码变成可执行文件,叫做编译(compile):先编译这个,还是先编译那个(即编译的安排),叫做构建(build). Make是最常用的构建工具,诞生于1977年,主要用于C语言的项目.但是实际上 , ...

  2. java基础之HashSet如何保证对象的唯一性

    首先Set集合是无序的 不可重复的 add的时候判断对象是否重复是用的equals HashSet<String> 存储String类型的数据时是可以保证数据的唯一性的 因为String类 ...

  3. 校准liunx时间简单好用的命令

    查看时间服务器的时间# rdate time-b.nist.gov 设置时间和时间服务器同步# rdate -s time-b.nist.gov 查看硬件时间 # hwclock 将系统时间写入硬件时 ...

  4. eclipse插件jd-eclipse的使用

    https://blog.csdn.net/u013215289/article/details/51275527

  5. freemaker 课程

    品优购电商系统开发 第12章 网页静态化解决方案-Freemarker 传智播客.黑马程序员 1.网页静态化技术Freemarker 1.1为什么要使用网页静态化技术 网页静态化解决方案在实际开发中运 ...

  6. C++ std::vector

    std::vector template < class T, class Alloc = allocator<T> > class vector; // generic te ...

  7. cactiez中文版10.1配置监控系统安装笔记

    1.安装虚拟机vmware_player2.创建虚拟机,设置桥接模式,内存4g,磁盘大小50G3.启动虚拟机,安装系统4.系统root 默认密码 CactiEZ5.配置网络静态IP,修改IP,网关等信 ...

  8. ASP.NET MVC 跨controller函数调用

    var controller = DependencyResolver.Current.GetService<ControllerClassName>(); controller.User ...

  9. HUST软工1501-1503班第2周作业成绩公布

    说明 本次公布的成绩对应的作业为: 第2周个人作业:WordCount编码和测试 如果同学对作业成绩存在异议,在成绩公布的72小时内(截止日期4月26日0点)可以进行申诉,方式如下: 毕博平台的第二周 ...

  10. 黑盒测试实践-任务进度-Day05

    任务进度11-30 使用工具 selenium 小组成员 华同学.郭同学.穆同学.沈同学.覃同学.刘同学 任务进度 经过了前两天的学习任务的安排,以下是大家的任务进度: 华同学(任务1) 1.由于昨天 ...