题意
有对父子在玩枪战游戏,有 n 把枪,,每把枪都有两个属性 A :攻击力 ,D:冷却时间。
初始都有 100 滴血,父亲会随机从 n 把枪里选择一把枪。
关于比赛有如下规定:
- 他俩第一枪一定是同时开的
- 能开枪就开枪
- 如果两人同时死亡,各有 50 % 的概率获胜
现在要你为儿子选择一把枪,使得其胜利的概率最大,输出这个概率
吐槽
读完这题,看到数据范围上来想的就是暴力,好傻啊,儿子肯定会选择杀掉 100 滴血最快的一把枪啊。
然后写代码的时候把时间最长的当做最厉害的枪了,交了5,6发都没有发现问题。
题解
直接判断杀掉 100 滴血最快的枪有几把,输出 (1.0 - x / 2 * n)。
代码
#include <bits/stdc++.h>
#define emplace_back push_back
#define pb push_back
#define fuck system("pause")
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const double eps = 1e-6;
const int inf = 0x3f3f3f3f;
const int N = 2e5 + 10;
struct node
{
int a, d;
} arr[N];
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int n;
scanf("%d", &n);
int minn = inf, num = 0;
for (int i = 1; i <= n; i++)
{
scanf("%d%d", &arr[i].a, &arr[i].d);
int now = (99 / arr[i].a) * arr[i].d;
if (now == minn)
num++;
else if (now < minn)
{
minn = now;
num = 1;
}
}
printf("%.6f
", (float)1.0 * (2 * n - num) / 2 / n);
}
// fuck;
return 0;
}