[BZOJ1306][CQOI2009]循环赛(搜索) 题面 BZOJ 洛谷 题解 爆搜一下,\(hash\)记录是否已经考虑过这个状态,记忆化解决问题. #include<iostream> #include<cstdio> #include<algorithm> #include<map> using namespace std; #define ll long long #define MOD 1000000007 map<ll,int>…
地址 看数据范围很明显的搜索题,暴力dfs是枚举按顺序每一场比赛的胜败情况到底,合法就累计.$O(3^{n*(n-1)/2})$.n到10的时候比较大,考虑剪枝. 本人比较菜所以关键性的剪枝没想出来,但由于数据较水,20个点就T了2个.依旧记下剪枝方案,没想到的用下划线和红笔标注: 剪枝一:个人觉得应该将数组从小到大排序来搜,这样感觉起来状态少一些.实测有时和从大到小相差不大,但有时可能有效. 剪枝二:如果当前选手就算赢了所有剩下的场也到不了分数,剪掉.弱剪枝. 剪枝三:如果剩下所有场全是决出胜…
Description Input 第一行包含一个正整数n,队伍的个数.第二行包含n个非负整数,即每支队伍的得分. Output 输出仅一行,即可能的分数表数目.保证至少存在一个可能的分数表. Sample Input 6 5 6 7 7 8 8 Sample Output 121 HINT N<=8 Source Solution 搜索,砍树式的剪枝.当某一队算到最后一场比赛时直接算结果,每次递归前判断如果以后几场全赢分数也达不到目标分数就剪枝,如果以后几场全输都超过目标分数也剪枝 代码运行时…
搜索好难啊. 1.对于每个分数集合记忆化. 2.某人得分超过总分,剪枝. 3.某人之后全赢也无法达到总分,剪枝. 4.每有一场比赛分出胜负总分会多三分,而平局则会多两分.某人的分出胜负场次或平局场次超过该限制,剪枝. 面向代码编程直到除了变量名几乎都一模一样还是T.最后发现记忆化判断某个状态是否已经搜过的时候,写成f.find(x)==f.end()而不是!f[x]会快几倍.果然一直都没有学会map. #include<iostream> #include<cstdio> #inc…
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;…
[传送门:BZOJ1306] 简要题意: 有n个队伍,每个队伍都要和其他队伍比一场,赢了的队得3分,输了的队不得分,打平两队各得一分,给出每个队伍的得分,求出对战方案数 题解: DFS暴搜!!一眼就觉得暴搜,但是时限尴尬,加了些剪枝,10s压线,真的幸运 剪枝: 1.如果当前队伍所搜索到的结果得分大于它自己的得分就退出 2.如果当前队伍全赢仍未搜索到的所有队伍都不能达到它自己的得分就退出 就这样,靠着RP,压着时限,AC(感人) 参考代码: #include<cstdio> #include&…
Input第一行包含一个正整数n,队伍的个数.第二行包含n个非负整数,即每支队伍的得分.Output输出仅一行,即可能的分数表数目.保证至少存在一个可能的分数表.Sample Input 6 5 6 7 7 8 8 Sample Output 121 Hint N<=8 这个明显就是爆搜吧,因为数据比较小. 但是数据十分神奇 枚举每场比赛,枚举编号较小的一队的结果,相应的较大的也可以推出结果 当有某一队剩下比赛全赢也比给定分数低就剪枝 当有某一队当前比分超过给定分数也剪枝 只要你把这俩个剪枝加上…
问题描述 n队伍比赛,每两支队伍比赛一次,平1胜3负0. 给出队伍的最终得分,求多少种可能的分数表. 输入格式 第一行包含一个正整数n,队伍的个数.第二行包含n个非负整数,即每支队伍的得分. 输出格式 输出仅一行,即可能的分数表数目.保证至少存在一个可能的分数表. 样例输入 6 5 6 7 7 8 8 样例输出 121 数据范围 N<=8 解析 这么小的范围肯定是搜索啊.状态即为当前比赛是哪两支队伍在进行,搜索比分表的上三角区域(不包括对角线).当搜索到第n行时,如果满足要求即可让答案加1.但是…
传送门 双倍经验题->这里 //minamoto #include<bits/stdc++.h> #define ll unsigned long long #define R register #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i) #define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i) using namespace std; const ll Base=17,P=1e9+7;co…
在洛谷上复制的题目! P3154 [CQOI2009]循环赛 题目描述 n队伍比赛,每两支队伍比赛一次,平1胜3负0. 给出队伍的最终得分,求多少种可能的分数表. 输入输出格式 输入格式: 第一行包含一个正整数n,队伍的个数.第二行包含n个非负整数,即每支队伍的得分. 输出格式: 输出仅一行,即可能的分数表数目.保证至少存在一个可能的分数表. 输入输出样例 输入样例#1: 复制 6 5 6 7 7 8 8 输出样例#1: 复制 121 说明 N<=8 就是一个很暴力的搜索,然而在$vjudge$…