 /**//*
題意:賭球押勝平負的賠率分別是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
搜索
最新評論

|
|