/**//* 题意:赌球押胜平负的赔率分别是a, b, c,押n元中了可获得floor(odds * n)。 给出硬币数coin 问最坏情况下能赚到的钱(因为赔率很大,所以能稳赚不赔,押三个的话)
最坏情况,也即在某种分配时,取赢钱最小的那种 用三重for枚举押的情况,当然取最小的作为这种情况的收益,这样铁定TLE 发现,对于一种押法,我们知道了最小收益的那个,除去这个的另外两重for是枚举是没用的, 另外两个的押的钱数增加,但答案还是原来那个! 所以改变枚举的方法,从1枚举到s 每次只将这一枚硬币放到当前收益最小的那种情况中,然后更新!! 浮点数,注意加eps 由于只有2位小数,改为整数也行
有一种优化,就是按照bc,ac,ab的比例先下注,然后再枚举
对于这种每次都选最小的,更新的时候应该只更新最小(会使最小的增加)的才高效!
*/ #include<cstdio> #include<cstring> #include<algorithm> using namespace std;
const double eps = 1e-5; int main() { int T; for(scanf("%d",&T);T--;) { int coin,num[3]; long long e[3],ans; double c[3]; scanf("%d%lf%lf%lf",&coin,&c[0],&c[1],&c[2]); ans = 0; num[0]=num[1]=num[2]=0; e[0]=e[1]=e[2]=0; for(int i=1;i<=coin;i++) { int k = min_element(e,e+3)-e; ++num[k]; e[k] = (int)(num[k]*c[k]+eps);//需要加一点eps 更新完最小后再放进去 ans = max(ans,*min_element(e,e+3)-i); } printf("%lld\n",ans+coin); } return 0; }
/**//* watashi神牛的代码~~ 0ms */ #include <cstdio> #include <algorithm>
using namespace std;
int main() { int re; int a, b, s, cc, ccc, ans, d[3], e[3]; long long c[3];
scanf("%d", &re); for (int ri = 1; ri <= re; ++ri) { scanf("%d", &s); for (int i = 0; i < 3; ++i) { scanf("%d.%d", &a, &b); c[i] = a * 100 + b; }
if (c[0] * c[1] * c[2] <= 100 * (c[0] * c[1] + c[1] * c[2] + c[2] * c[0])) { printf("%d\n", s); } else { ans = 0; cc = max(0, s - 100);//一定要有这一句 -100可能是因为 0.01*100=1 但是具体我退不出 ccc = c[0] * c[1] + c[1] * c[2] + c[2] * c[0]; d[0] = cc * c[1] * c[2] / ccc;//最后再除的 d[1] = cc * c[2] * c[0] / ccc; d[2] = cc * c[0] * c[1] / ccc; for (int i = 0; i < 3; ++i) { e[i] = d[i] * c[i] / 100; } for (int i = d[0] + d[1] + d[2]; i <= s; ++i) { int k = min_element(e, e + 3) - e; ans = max(ans, e[k] - i); ++d[k]; e[k] = d[k] * c[k] / 100; } printf("%d\n", s + ans); } }
return 0; }
3355 判断是否稳赚不赔 ax>x+y+z by>x+y+x cz>x+y+z 推出 1/a+1/b+1/c<1 注意是必要条件
同时如果上式成立,那么按b*c, c*a, a*b的比率去押注,就可以做到稳赚不赔,所以也是充分条件。
|
|
常用链接
随笔分类
Links
搜索
最新评论
|
|