POJ2496 Military Recruit

                                                                                            Military Recruit
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 1124   Accepted: 542

Description

Background 
Tom is a military recruit for an elite army unit. As the last part of his final exams, he will be put into unknown terrain and has to find his way to a designated exit point, carrying all his heavy military gear. 
As Tom is a little bit afraid of this task, he has used Google Maps to obtain satellite images of the training area. He has identified all the possible entry and exit spots and possible connections with their estimated length. This relation between sites does not need to be symmetric due to different terrain heights. 
However, he does not know, from which site to which site he will have to march. Unfortunately, he quickly realizes that he won't be able to successfully perform the march in the worst-case of the two sites that have the maximum distance to each other, no matter how hard he practices. 
Common sense tells him that his instructors will always pick distinct sites for the entry and exit sites, and he assumes that every pair of distinct sites has equal probability to become his task. 
Problem 
Given a set of sites, possible connections between some of the sites together with their length and Tom's desired success probability p, you are to compute the minimum distance Tom must be comfortable with so that he will pass his exam with at least probability p, assuming that every pair of distinct sites is equally likely.

Input

The first line contains the number of scenarios. 
The next line contains an integer p (1 <= p <= 100) specifying Tom's minimum success probability. Then follows a line with the number of sites n (2 <= n <= 100). The subsequent n lines contain n integers each, separated by a space. The i-th line contains the distances from site i to all other sites, e.g. the distance from site i to site j can be found in the i-th line at position j. Distances are non-negative integers less than 1000. The distance from a site to itself will always be zero. If the distance between two sites is "-1" there is no direct connection between those sites in the corresponding direction. You can assume that every site can be reached somehow from every other site.

Output

The output for every scenario begins with a line containing "Scenario #i:", where i is the number of the scenario starting at 1. 
Then print a single line with the minimum distance Tom has to practice for followed by an empty line.

Sample Input

2
67
3
0 1 2
1 0 3
2 3 0
50
4
0 1 -1 -1
-1 0 1 999
1 -1 0 -1
-1 999 -1 0

Sample Output

Scenario #1:
3

Scenario #2:
2

Source

 
 

思路

一个测试,给出N个点之间的距离。然后给出一个概率P(注意这个P是个整数,转换成概率后要除以100,然后变成小数)。然后这个人随即选起始点对(起点和终点时不同的),问,这个人至少能够完成多远的距离,才能通过以概率P/100通过测试。首先利用FLOYD求出这些点之间的距离。然后把距离排序。找出符合条件的最小距离即可。
 

代码

 1 #include <cstdlib>
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <cctype>
 7 #include <algorithm>
 8 
 9 #define MAXCOST 99999999
10 
11 using namespace std;
12 
13 
14 int mp[100+2][100+2];
15 int final_cost[100*100+4];
16 
17 
18 
19 int main(int argc, char *argv[])
20 {
21     
22     int t;
23     
24     scanf("%d",&t);
25     
26     int i,j,k;
27     int casen=1;
28     for(casen=1;casen<=t;casen++)
29     {
30                                  int n,m;
31                                  double p;
32                                  scanf("%lf",&p);
33                                  scanf("%d",&n);
34                                  
35                                  for(i=1;i<=n;i++)
36                                  {
37                                                  for(j=1;j<=n;j++)
38                                                  {
39                                                                   int cost;
40                                                                   scanf("%d",&cost);
41                                                                   if(cost==-1)
42                                                                   {mp[i][j]=MAXCOST;}
43                                                                   else
44                                                                   {mp[i][j]=cost;}
45                                                  }
46                                  }
47                                  
48                                  
49                                  for(k=1;k<=n;k++)
50                                  for(i=1;i<=n;i++)
51                                  for(j=1;j<=n;j++)
52                                  {
53                                                   if(mp[i][j]>mp[i][k]+mp[k][j])
54                                                   mp[i][j]=mp[i][k]+mp[k][j];
55                                  }
56                                  k=0;
57                                  
58                                  for(i=1;i<=n;i++)
59                                  for(j=1;j<=n;j++)
60                                  {if(i==j)
61                                  continue;
62                                  final_cost[k++]=mp[i][j];}
63                                  
64                                  
65                                  
66                                  
67                                  sort(final_cost,final_cost+k);
68                                  p/=100.0;
69                                  
70                                 
71                                  double tmp=p*k;
72                                  
73                                  int x=(int)ceil(tmp);
74                                  
75                                  
76                                  printf("Scenario #%d:\n",casen);
77                                  
78                                  printf("%d\n\n",final_cost[x-1]);
79                                  
80                                  
81                                  
82                                  
83     }
84                                                   
85                                                   
86                                                   
87                                                   
88     
89     
90     
91     
92     
93     system("PAUSE");
94     return EXIT_SUCCESS;
95 }

 

posted @ 2012-10-24 22:51  cseriscser  阅读(250)  评论(0编辑  收藏  举报