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; }