您的位置:首页 > 其它

CF#335 Intergalaxy Trips

2015-12-21 10:22 323 查看
Intergalaxy Trips

time limit per test
2 seconds

memory limit per test
256 megabytes

input
standard input

output
standard output

The scientists have recently discovered wormholes — objects in space that allow to travel very long distances between galaxies and star systems.

The scientists know that there are n galaxies within reach. You are in the galaxy number 1 and you need to get to the galaxy number n. To get from galaxy i to galaxy j, you need to fly onto a wormhole (i, j) and in exactly one galaxy day you will find yourself in galaxy j.

Unfortunately, the required wormhole is not always available. Every galaxy day they disappear and appear at random. However, the state of wormholes does not change within one galaxy day. A wormhole from galaxy i to galaxy j exists during each galaxy day taken separately with probability pij. You can always find out what wormholes exist at the given moment. At each moment you can either travel to another galaxy through one of wormholes that exist at this moment or you can simply wait for one galaxy day to see which wormholes will lead from your current position at the next day.

Your task is to find the expected value of time needed to travel from galaxy 1 to galaxy n, if you act in the optimal way. It is guaranteed that this expected value exists.

Input
The first line of the input contains a single integer n (1 ≤ n ≤ 1000) — the number of galaxies within reach.

Then follows a matrix of n rows and n columns. Each element pij represents the probability that there is a wormhole from galaxy i to galaxy j. All the probabilities are given in percents and are integers. It is guaranteed that all the elements on the main diagonal are equal to 100.

Output
Print a single real value — the expected value of the time needed to travel from galaxy 1 to galaxy n if one acts in an optimal way. Your answer will be considered correct if its absolute or relative error does not exceed 10 - 6.

Namely: let's assume that your answer is a, and the answer of the jury is b. The checker program will consider your answer correct, if

/**
Create By yzx - stupidboy
*/
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <ctime>
#include <iomanip>
using namespace std;
typedef long long LL;
typedef double DB;
#define MIT (2147483647)
#define INF (1000000001)
#define MLL (1000000000000000001LL)
#define sz(x) ((int) (x).size())
#define clr(x, y) memset(x, y, sizeof(x))
#define puf push_front
#define pub push_back
#define pof pop_front
#define pob pop_back
#define mk make_pair

inline int Getint()
{
int Ret = 0;
char Ch = ' ';
bool Flag = 0;
while(!(Ch >= '0' && Ch <= '9'))
{
if(Ch == '-') Flag ^= 1;
Ch = getchar();
}
while(Ch >= '0' && Ch <= '9')
{
Ret = Ret * 10 + Ch - '0';
Ch = getchar();
}
return Flag ? -Ret : Ret;
}

const DB EPS = 1e-7;
const int N = 1010;
int n, data

;
DB dp
, stay
, cnt
;
bool visit
;

inline void Input()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
scanf("%d", &data[i][j]);
}

inline void Solve()
{
for(int i = 1; i <= n; i++) dp[i] = INF, stay[i] = 1.0, cnt[i] = 0.0;
dp
= 0;
for(int k = 1; k <= n; k++)
{
int idx = -1;
DB mn = INF;
for(int i = 1; i <= n; i++)
if(!visit[i] && mn >= dp[i])
mn = dp[i], idx = i;

if(idx == 1)
{
printf("%.12lf\n", dp[1]);
break;
}

visit[idx] = 1;
for(int i = 1; i <= n; i++)
if(!visit[i])
{
cnt[i] += stay[i] * dp[idx] * (0.01 * data[i][idx]);
stay[i] *= 1 - 0.01 * data[i][idx];
if(fabs(1 - stay[i]) > EPS)
dp[i] = (1 + cnt[i]) / (1 - stay[i]);
}
}
}

int main()
{
freopen("a.in", "r", stdin);
Input();
Solve();
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: