1. 程式人生 > 實用技巧 >B - Blow up the Enemy

B - Blow up the Enemy

https://vjudge.net/contest/386568#problem/B

Zhang3 is playing a shooting game with Father. In the game there are two players trying to kill each other to win the game.

The game providesnnweapons, each has two properties: Damage and Delay. Theithithweapon has DamageAiAiand DelayDiDi. When a player shoots with this weapon, his enemy's HP is reduced by
AiAi, then he must wait forDiDims 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 thennweapons with equal probabilities. Each player can only use the chosen weapon during the game.
2. When the game starts, Zhang3 and Father have100100HP 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(1T100)T(1≤T≤100).TTtest cases follow.

For each test case, the first line contains an integern(1n1000)n(1≤n≤1000), the number of weapons in the game.

Thennnlines follow, theithithof which contains two integersAi,Di(1Ai100,1Di10000)Ai,Di(1≤Ai≤100,1≤Di≤10000), representing the Damage and the Delay of each weapon.

The sum ofnnin all test cases doesn't exceed20002000.
OutputFor each test case, print a line with a real numberp(0p1)p(0≤p≤1), representing the optimal probability.

Your answers should have absolute or relative errors of at most10610−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;
}