1002:http://acm.hdu.edu.cn/showproblem.php?pid=6803
题意:就是给你n把武器,每把武器都有伤害和射击间隔,你的对手是随机选择武器,你可以选择任意武器包括对手选的那把,如果你们的生命同时小于等于0,你获胜概率是50%,问你最大的胜利概率是多少。
思路:很明显,我们想要赢,我们就要选择那把杀人最快的武器。那么问题就变成计算杀人时间,然后排序,选第一把。但是可能很多把武器时间一样。统计一下这个数量就好。
//team yglance+xhwl+TTD
#include<bits/stdc++.h>
typedef long long ll;
const ll mod=1e9+7;
const ll maxn=1e5+7;
const double pi=acos(-1);
using namespace std;
//就是算出每把武器杀人时间,然后贪心
int ti[1005];//杀人时间
int a,b;
int main()
{
ios::sync_with_stdio(false);
//freopen("in.txt","r",stdin);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a>>b;
if(100%a==0)
{
ti[i]=b*((100/a)-1);
}
else
{
ti[i]=b*(100/a);
}
}//计算杀人时间
sort(ti,ti+n);//排序
int ans=1;//最少有一把杀人时间最短
for(int i=1;i<n;i++)
{
if(ti[i]==ti[0])
{
ans++;//相等数量增加
}
else
{
break;
}
}
//现在有ans把武器,杀人时间最短
cout<<fixed<<setprecision(6)<<double(n-ans)/n+0.5*double(ans)/n<<endl;//别人选到那些杀人时间不是最短的武器,他必输,选到这些,五五开。
}
return 0;
}

京公网安备 11010502036488号