2020杭电多校第四场 B题 Blow up the Enemy(简单求概率)

题面:Blow up the Enemy

思路:

思路简单,比赛憨,我是铁憨憨。
由于两个人都只有 100 H P 100HP 100HP,所以对于每种武器,我们都可以算出该武器击杀对方的时间。
攻击次数为: ⌈ 100 a [ i ] ⌉ \left \lceil \cfrac{100}{a[i]} \right \rceil a[i]100
击杀对方的时间为: ( ⌈ 100 a [ i ] ⌉ − 1 ) ∗ d [ i ] (\left \lceil \cfrac{100}{a[i]} \right \rceil - 1) * d[i] (a[i]1001)d[i]
而最优的情况就是选用能使击杀对方时间最少的武器,所以我们要求出用每个武器击杀对方的时间,并将其中时间最小值记录下来。
注意:可能有多个最优的情况,所以我们要将每个最优情况统计出来,这里用 c n t cnt cnt 统计。
最后, a n s = 1 − c n t / n ∗ 0.5 ans=1-cnt/n*0.5 ans=1cnt/n0.5

代码如下:
#include 
#define sc scanf
#define pf printf
using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 1010;
const int INF = 0x3f3f3f3f;
const double eps = 1e-7;
const int mod = 1e9 + 7;

int T, a[N], d[N], t[N];

void solve()
{
    int n, mint = INF, cnt = 0;
    sc("%d", &n);
    for(int i = 0; i < n; i++) {
        sc("%d %d", &a[i], &d[i]);
        t[i] = ((100 + a[i] - 1) / a[i] - 1) * d[i];
        mint = min(t[i], mint);
    }
    for(int i = 0; i < n; i++) if(t[i] == mint) cnt++;
    double ans = 1 - (double)cnt / n * 0.5;
    pf("%g\n", ans);
}

int main()
{
    sc("%d", &T); while(T--) solve();
    return 0;
}

你可能感兴趣的:(算法,概率论)