B - Blow up the Enemy
https://vjudge.net/contest/386568#problem/B
The game provides nn weapons, each has two properties: Damage and Delay. The ithith weapon has Damage AiAi and Delay DiDi. When a player shoots with this weapon, his enemy's HP is reduced by AiAi, then he must wait for DiDi ms before he can shoot again.
The game processes as follows:
1. Before the game starts, Zhang3 and Father choose a weapon respectively. Father always randomly chooses one of the nn weapons with equal probabilities. Each player can only use the chosen weapon during the game.
2. When the game starts, Zhang3 and Father have 100100 HP each. They make their first shot at the same time.
3. They keep shooting as quickly as possible. That means, a player shoots instantly whenever he can shoot, until the game ends.
4. When a player's HP is reduced to 0 or lower, he dies and the game ends. If the other player is still alive (i.e. has HP higher than 0), then the living player wins the game; otherwise (if the two players die at the same time), each player has 50%50% probability to win the game.
Zhang3 wants to win the game. Please help her to choose a weapon so that the probability to win is maximized. Print the optimal probability.
InputThe first line of the input gives the number of test cases, T(1≤T≤100)T(1≤T≤100). TT test cases follow.
For each test case, the first line contains an integer n(1≤n≤1000)n(1≤n≤1000), the number of weapons in the game.
Then nn lines follow, the ithith of which contains two integers Ai,Di(1≤Ai≤100,1≤Di≤10000)Ai,Di(1≤Ai≤100,1≤Di≤10000), representing the Damage and the Delay of each weapon.
The sum of nn in all test cases doesn't exceed 20002000.
OutputFor each test case, print a line with a real number p(0≤p≤1)p(0≤p≤1), representing the optimal probability.
Your answers should have absolute or relative errors of at most 10−610−6.
Sample Input
2 1 100 100 4 50 50 40 20 30 10 20 100
Sample Output
0.5 0.875
题意:
父亲 和 儿子 对战游戏:
从n个武器中选择一种,每种武器有伤害A,两次使用的时间间隔D
父亲的武器随机选择,儿子选一种武器,使得儿子获胜概率最大。
输出最大获胜率
思路:
贪心,儿子选择性价比最高的,使得在时间相同的情况下打出的伤害更快达到100;
父亲选择强道具的概率 = 强道具个数 / n;
则儿子获胜概率为 (1/2)强道具个数 / n;
1)父亲未选择强武器,概率(n - 强道具个数)/ 强道具个数;
2)在此情况下儿子胜率为(n - 强道具个数)/ 强道具个数
最大概率为两数和
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<bitset> #include<cassert> #include<cctype> #include<cmath> #include<cstdlib> #include<ctime> #include<deque> #include<iomanip> #include<list> #include<map> #include<queue> #include<set> #include<stack> #include<vector> #include <vector> #include <iterator> #include <utility> #include <sstream> #include <limits> #include <numeric> #include <functional> using namespace std; #define gc getchar() #define mem(a) memset(a,0,sizeof(a)) //#define sort(a,n,int) sort(a,a+n,less<int>()) #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair<int,int> pii; typedef char ch; typedef double db; const double PI=acos(-1.0); const double eps=1e-6; const int inf=0x3f3f3f3f; const int maxn=1e5+10; const int maxm=100+10; const int N=2e5+10; const int mod=1e9+7; double P = 0; double A = 0 , D = 0; double Bestchoice = 0; double T = 0; double T_min = 1e9; int main() { int t = 0; int n = 0; cin >> t; while(t--) { Bestchoice = 0; T = 0; T_min = 1e9; cin >> n; for(int i = 0;i<n;i++) { cin >> A >> D; T = D * ((100+A-1)/A - 1); if(T == T_min) { Bestchoice += 1; } if(T < T_min) { T_min = T; Bestchoice = 1; } } P = (n-Bestchoice)/n + Bestchoice/(n*2); cout << setprecision(2) << P <<endl; } return 0; }