科比的比赛(题解)(贪心+搜索)

标签:算法——贪心

阅读体验:https://zybuluo.com/Junlier/note/1301158

贪心+搜索

洛谷题目:P2460 [SDOI2007]科比的比赛

也可以贪心+网络流+状压dp

这道题其实真的不是很难的

为什么一直没有人做(其实我也是看到科比才进来的。。。)

入正题吧

思路一:贪心

爆搜肯定过不了对吧

看一下题目,发现这个\(m\)好大八大

再仔细看一下题目,发现\(n\)给的很舒服啊

于是有一个大胆的想法:复杂度和\(n\)有关,和\(m\)无关

怎么说呢:

我们可以发现我们再怎么打,一场里面最多有9个球员之前打过对吧,也就是说,如果我们把每一场的球员按照胜率排序,那么和答案有关的最多就只有10个人对吧

所以我们考虑对每一场按照胜率把球员排序(能力值为第二关键字),一下子省去好多。。。

思路二:不用讲了吧

贪心都干了这么多活了,你搜索随便剪一下枝不就过了

嗯,算半个\(A^*\)吗

  • 把每场比赛以后能打出的最大胜率预处理出来
  • 把每场比赛以后能打到的最大能力值预处理出来

剪剪剪,没了。。。

思路三:更优秀的方法?

我觉得可行:

  • 第一问你跑一个最大费用流
  • 第二问你跑一个状压dp?Maybe

应该比搜索要快吧(如果你想跑快点,反正我没打)

关于精度

题目里说是\(1e-10\)的精度保障就\(ojbk\)

然而,经过惨痛的试数据后发现要保留到小数点后12位

不然不是too short就是too long。。。

代码

我就放一个搜索+贪心的方法吧。。。

如果还不懂的讨论区问吧。。。

#include<bits/stdc++.h>
#define il inline
#define rgt register int
#define lst long long
#define ldb double
#define N 15
#define M 100050
using namespace std;
const int Inf=1e9;
const ldb eps=1e-10;
il int read()
{
int s=0,m=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')m=1;ch=getchar();}
while( isdigit(ch))s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return m?-s:s;
} int n,m;
int val[M],nn[N];
int Nn[N],Ans_ss;
ldb Gl[N],Ans_gl;
bool vis[M];
struct PLAY{int id;ldb mb;}peo[M],ljl[N][N];
int Calc(ldb x,ldb y)
{
if(abs(x-y)<=eps)return 2;
else return x>y;
} bool cmp(const PLAY &a,const PLAY &b)
{
if(Calc(a.mb,b.mb)==2)
return val[a.id]>val[b.id];
return a.mb>b.mb;
} void Dfs(int now,ldb gl,int ss)//rival
{
if(now==n+1)
{
if(Calc(gl,Ans_gl)>0)
Ans_gl=gl,Ans_ss=max(Ans_ss,ss);
return;
}
if(Calc(gl*Gl[now],Ans_gl)==0)return;
if(Calc(gl*Gl[now],Ans_gl)==2&&ss+Nn[now]<=Ans_ss)return;
for(int i=1;i<=n;++i)
{
if(vis[ljl[now][i].id])continue;
vis[ljl[now][i].id]=true;
Dfs(now+1,gl*ljl[now][i].mb,ss+val[ljl[now][i].id]);
vis[ljl[now][i].id]=false;
}
} int main()
{
freopen("s.in","r",stdin);
n=read(),m=read();
for(int i=1;i<=m;++i)val[i]=read();
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
peo[j].id=j,scanf("%lf",&peo[j].mb);
sort(peo+1,peo+m+1,cmp);
for(int j=1;j<=n;++j)
ljl[i][j]=peo[j],nn[i]=max(nn[i],val[peo[j].id]);
}Gl[n]=ljl[n][1].mb;
for(int i=n-1;i>=1;--i)
{
Gl[i]=Gl[i+1]*ljl[i][1].mb;
Nn[i]=Nn[i+1]+nn[i];
}Dfs(1,1,0);
printf("%.12lf\n%d\n",Ans_gl,Ans_ss);
return 0;
}

洛谷P2460 [SDOI2007]科比的比赛(题解)(贪心+搜索)的更多相关文章

  1. 洛谷P1854 花店橱窗布置 分析+题解代码

    洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...

  2. HAOI2006 (洛谷P2341)受欢迎的牛 题解

    HAOI2006 (洛谷P2341)受欢迎的牛 题解 题目描述 友情链接原题 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之 ...

  3. 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)

    洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...

  4. 洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速$dp\&Floyd$)

    洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速\(dp\&Floyd\)) 标签:题解 阅读体验:https://zybuluo.com/Junl ...

  5. 【洛谷4005】小Y和地铁(搜索)

    [洛谷4005]小Y和地铁(搜索) 题面 洛谷 有点长. 题解 首先对于需要被链接的两个点,样例中间基本上把所有的情况都给出来了. 但是还缺了一种从下面绕道左边在从整个上面跨过去在从右边绕到下面来的情 ...

  6. BZOJ4946 & 洛谷3826 & UOJ318:[NOI2017]蔬菜——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4946 https://www.luogu.org/problemnew/show/P3826 ht ...

  7. 洛谷1578:[WC2002]奶牛浴场——题解

    https://www.luogu.org/problemnew/show/P1578#sub 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建 ...

  8. 洛谷 P1146 【硬币翻转】题解

    很久很久之前做过的一道题 翻n-1枚硬币,就是有一枚不翻,也可以理解为翻一枚 直接上程序,看程序说话 #include<iostream> using namespace std; ; b ...

  9. 洛谷P1972 [SDOI2009]HH的项链 题解

    [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不 ...

随机推荐

  1. bzoj4819 [Sdoi2017]新生舞会 分数规划+最大费用最大流

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4819 题解 首先上面说, \[ C = \frac{\sum\limits_{i=1}^n a ...

  2. 前端框架之BootStrap的简单介绍

    Bootstrap补充 一.一个小知识点 1.截取长屏的操作 2.设置默认格式 3.md,sm, xs 4.空格和没有空格的选择器 二.响应式介绍 - 响应式布局是什么? 同一个网页在不同的终端上呈现 ...

  3. python的setup.py文件

    最近工作需要,用Cython写了*.pyx扩展,并将其编译成C文件,最后转换为so扩展,供python引用使用 distutils 编译,建立一个setup.py 的脚本from distutils. ...

  4. 【JavaScript】数组方法之基础方法

    数组方法之基础方法 Array 对象属性 属性 描述 constructor 返回对创建此对象的数组函数的引用. length 设置或返回数组中元素的数目. prototype 使您有能力向对象添加属 ...

  5. 题解 P2674 【《瞿葩的数字游戏》T2-多边形数】

    题目说了很清楚,此题找规律,那么就找规律. 我们观察数列. 令k表示数列的第k个数. 三角形数:1 3 6 10 15 两项相减:1 2 3 4 5 再次相减:1 1 1 1 1 四边形数:1 4 9 ...

  6. HDU 5919 Sequence ll

    Time limit 4500 ms Memory limit 131072 kB OS Windows Source 2016中国大学生程序设计竞赛(长春)-重现赛 中文题意 一个长度为n的序列,里 ...

  7. 解决:父类中的@NotNull无效以及@Notnull 验证list对象无效

    解决方法如图: controller层 vo.param层 父类验证注解要使用@NotEmpty 不能使用 @NotNull,否则验证无效的,反正笔者是没有成功过

  8. Java继承和多态-Static关键字

    1. 什么是Static 关键字? Static 能够与变量,方法和类一起使用,称为静态变量,静态方法.如果在一个类中使用static修饰变量或者方法的话,它们可以直接通过类访问,不需要创建一个类的对 ...

  9. HDU6621 K-th Closest Distance 第 k 小绝对值(主席树(统计范围的数有多少个)+ 二分 || 权值线段树+二分)

    题意:给一个数组,每次给 l ,r, p, k,问区间 [l, r] 的数与 p 作差的绝对值的第 k 小,这个绝对值是多少 分析:首先我们先分析单次查询怎么做: 题目给出的数据与多次查询已经在提示着 ...

  10. optistruct对称约束设置

    如对YZ面对称,则在对称面处约束1 5 6自由度.