绝地求生游戏的规则是,所有人从飞机上跳伞到荒岛上某个坐标,然后在这里相互厮杀,最后一个活下来的玩家获胜。
为了让游戏更丰富有趣,每一个时刻,一个圆形区域将会受到轰炸机的轰炸,我们可以认为,此时此刻,轰炸范围内的玩家都会阵亡。
TYZ著名颓废OI选手HJY今天和她的伙伴们一起玩吃鸡,但是HJY总是吃不到鸡(赢不了),因此她决定跟对手们一起比RP。
假设所有人在落地的一瞬间开始,就都站立不动,等待轰炸,每一个时刻,轰炸机都会在原先设定好的m个圆形轰炸区域中,等概率的选择其中一个轰炸区域,然后把这个区域内的活人全部炸死(在区域边缘也算炸死,如果半径为0,那么在轰炸点的位置也算被炸死)。当只剩下一个人活着,或者所有的人都被炸死(最后一次同时死掉)的时候,游戏结束。
注意:每次轰炸是随机选一个轰炸区域,一个区域可以被轰炸多次。
假设某次轰炸,炸死了K个人,那么,所有在这次轰炸之后还活着的人会得到K分。
HJY一开始就知道每个人的坐标以及每次轰炸的区域信息,请问,HJY在这次比赛中得分的期望值是多少呢?
/*************************************************************************
> File Name: d.cpp
> Author: Henry Chen
> Mail: 390989083@qq.com
> Created Time: 四 10/ 1 11:35:17 2020
************************************************************************/
#include<bits/stdc++.h>
using namespace std;
struct people
{
int x,y;
}p[20];
struct cir
{
int x,y,r;
}ex[100001];
bool ck(people a,cir b)
{
double dis = sqrt(1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y));
if(dis <= b.r) return 1;
return 0;
}
int main()
{
int n,m;
cin >> n >> m;
for(int i = 1;i <= n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
}
for(int i = 1;i <= m;i++)
{
scanf("%d%d%d",&ex[i].x,&ex[i].y,&ex[i].r);
}
double ans = 0;
for(int i = 2;i <= n;i++)
{
int sm1 = 0;
int sm2 = 0;
for(int j = 1;j <= m;j++)
{
if(!ck(p[1],ex[j]) && ck(p[i],ex[j]))
{
sm1++;
}
else if(ck(p[1],ex[j]))
{
sm2++;
}
}
//printf("%d %d %d\n",i,sm1,sm2);
ans += sm1/1.0/(sm2+sm1);
}
//cout << ans << endl;
printf("%.2lf\n",ans);
return 0;
}
正解是状态压缩的期望dp,我这里使用的依赖每个人对于答案的期望贡献的独立性,分别统计。
原文:https://www.cnblogs.com/mzyy1001/p/13758742.html