地址 看数据范围很明显的搜索题,暴力dfs是枚举按顺序每一场比赛的胜败情况到底,合法就累计.$O(3^{n*(n-1)/2})$.n到10的时候比较大,考虑剪枝. 本人比较菜所以关键性的剪枝没想出来,但由于数据较水,20个点就T了2个.依旧记下剪枝方案,没想到的用下划线和红笔标注: 剪枝一:个人觉得应该将数组从小到大排序来搜,这样感觉起来状态少一些.实测有时和从大到小相差不大,但有时可能有效. 剪枝二:如果当前选手就算赢了所有剩下的场也到不了分数,剪掉.弱剪枝. 剪枝三:如果剩下所有场全是决出胜…
Input第一行包含一个正整数n,队伍的个数.第二行包含n个非负整数,即每支队伍的得分.Output输出仅一行,即可能的分数表数目.保证至少存在一个可能的分数表.Sample Input 6 5 6 7 7 8 8 Sample Output 121 Hint N<=8 这个明显就是爆搜吧,因为数据比较小. 但是数据十分神奇 枚举每场比赛,枚举编号较小的一队的结果,相应的较大的也可以推出结果 当有某一队剩下比赛全赢也比给定分数低就剪枝 当有某一队当前比分超过给定分数也剪枝 只要你把这俩个剪枝加上…
[传送门:BZOJ1306] 简要题意: 有n个队伍,每个队伍都要和其他队伍比一场,赢了的队得3分,输了的队不得分,打平两队各得一分,给出每个队伍的得分,求出对战方案数 题解: DFS暴搜!!一眼就觉得暴搜,但是时限尴尬,加了些剪枝,10s压线,真的幸运 剪枝: 1.如果当前队伍所搜索到的结果得分大于它自己的得分就退出 2.如果当前队伍全赢仍未搜索到的所有队伍都不能达到它自己的得分就退出 就这样,靠着RP,压着时限,AC(感人) 参考代码: #include<cstdio> #include&…
Description Input 第一行包含一个正整数n,队伍的个数.第二行包含n个非负整数,即每支队伍的得分. Output 输出仅一行,即可能的分数表数目.保证至少存在一个可能的分数表. Sample Input 6 5 6 7 7 8 8 Sample Output 121 HINT N<=8 Source Solution 搜索,砍树式的剪枝.当某一队算到最后一场比赛时直接算结果,每次递归前判断如果以后几场全赢分数也达不到目标分数就剪枝,如果以后几场全输都超过目标分数也剪枝 代码运行时…
dfs+剪枝*4(通过得很勉强): 1.只枚举一半的比赛,另一半直接得出. 2.处理前缀和,若大于目标得分则剪枝 3.前缀和加上若接下来全胜的得分 仍小于 目标得分,则剪枝. 4.枚举到每个人的最后一场比赛时直接用 目标得分-前缀和 计算出最后一场的应得分. Code还是很简单的: #include<cstdio> using namespace std; ,,,}; ],ans,Pre[]; void dfs(int x,int y) { if(Pre[x]>a[x])return;…
预先警告:我的做法代码量比较大 看完题目后看到数据n<=8, 不难想到这题可以写深搜来做 分析 比如说以数据: 3 3 3 3 为例子, 进行了三场比赛:AB AC BC: 我们只要搜索每场比赛,并枚举比赛的三个结果(胜.负.平)并判断能否达到答案的分数即可 如果是三个人: void dfs(int step) { if(step==cs+1){ int ff=1; for(int i=1;i<=n;i++) if(a[i]!=s[i]) ff=0; if(ff) ans++; return;…
Description 给定正整数n和k,问能否将n分解为k个不同正整数的乘积 Input 第一行一个数T(T<=4000)表示测试组数 接下来T行每行两个数n(n<=10^9),k(k<=20) Output 输出T行,若可以被分解,输出”TAK”否则输出”NIE” Sample Input 3 15 2 24 4 24 5 Sample Output TAK TAK NIE 题解 搜索+剪枝,先求出所有因数,然后暴力搜索,剪枝就是如果后面最小的k个数当前数相乘大于n就退出. orz…
大力剪枝,最后洛谷上还开了o2才过-- 大概这样剪枝: 1.搜索中,一个队当前得分超过要求或者一个队剩下的比赛场数全赢也达不到要求则return: 2.注意到如果平局,最总分的贡献是2,否则是3,所以可以计算出非平局的常数,dfs中记录一下当前非平局有几场,如果超出要求或者剩下的场次全都非平局也达不到要求则return: 3.如果当前队需要全赢剩下的比赛才能达到要求,就直接使他全赢然后跳过与这个对相关的比赛: 4.如果当前队需要全赢剩下的比赛才能达到要求,就直接使他全输然后跳过与这个对相关的比赛…
[题目描述] xyz1048576正在玩一个关于矩阵的游戏. 一个n*m的矩阵,矩阵中每个数都是[1,12]内的整数.你可以执行下列两个操作任意多次: (1)指定一行,将该行所有数字+1. (2)指定一列,将该列所有数字+1. (3)如果执行完上述操作之后,矩阵中某个数变成了3,6,9,12其中的某一个,我们认为这个数是稳的. 给定初始矩阵,求出任意执行操作之后稳数的最多个数. [输入格式] 第一行包含两个正整数n,m. 接下来n行,每行m个数,描述这个矩阵. [输出格式] 一个整数,表示答案.…
题意 设 $r = \frac{-1+\sqrt7 i}{2}$,对任意整数 $x, y$ 都可以找到一个有限的整数集合 $S$,使得 $$x + y\sqrt7 i = \sum_{k \in S }r^k$$ 换句话说,就是将 $x + y \sqrt7 i$ 转换成 $r$ 进制,集合中不能包含相同的元素,可以证明 $S$ 是唯一的. 输入 $x$ 和 $y$,从小到大输出 $S$ 中的元素. 分析 模拟一下复数乘法,很容易求出 $r$ 的各个次方.(预处理前24项,为什么呢?太大了无法在…