POJ2496 Military Recruit

                                                                                       Military Recruit
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 1110   Accepted: 536

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个点,以及这N个点之间的距离,这些距离都是单向的。然后给出一个概率P。有一个士兵需要需要行军。行军的起点和终点为:在这N个点中,可能随机的选择其中的某一个为起点,再随机的选择一个与起点不同的点为终点。如果士兵能够走完这两个点之间的距离,则说这个士兵能够完成任务。最后求这个人最少需要完成多少的距离,才能够使完成任务的概率>=P。
       首先,求出这些点之间的最短距离。然后对这些距离进行排序(注意:需要排除I->I的距离。无法到达的距离)。然后求出第X个最短距离。X=N*(N-1)*P/100。其中X为整数。所以:当N*(N-1)*P%100!=0,X需要在N*(N-1)*P/100的基础上加1。
 
  1 #include <cstdlib>
  2 #include <iostream>
  3 #include <cstdio>
  4 #include <cstring>
  5 #include <cmath>
  6 #include <string>
  7 #include <map>
  8 #include <algorithm>
  9  
 10 #define MAXINT 99999999
 11 
 12 using namespace std;
 13 
 14 int data[100+4][100+4];
 15 
 16 
 17 int dis[100*100+4];
 18 
 19 
 20 
 21 
 22 int main(int argc, char *argv[])
 23 {
 24         
 25         int t;
 26         int n,m;
 27         
 28         int i,j,k;
 29         
 30         
 31         scanf("%d",&t);
 32         
 33         int p;
 34         
 35         int z;
 36         for(z=1;z<=t;z++)
 37         {
 38                          scanf("%d",&p);
 39                          scanf("%d",&n);
 40                          
 41                          for(i=1;i<=n;i++)
 42                          {
 43                                           for(j=1;j<=n;j++)
 44                                           {
 45                                                            scanf("%d",&data[i][j]);
 46                                                            if(data[i][j]<=0)
 47                                                            data[i][j]=MAXINT;
 48                                           }
 49                          }
 50                          
 51                          
 52                          for(k=1;k<=n;k++)
 53                          for(i=1;i<=n;i++)
 54                          for(j=1;j<=n;j++)
 55                          {if(data[i][j]>data[i][k]+data[k][j])
 56                           data[i][j]=data[i][k]+data[k][j];
 57                          }
 58                          
 59                          k=0;
 60                          for(i=1;i<=n;i++)
 61                          for(j=1;j<=n;j++)
 62                          {
 63                          
 64                                           if(i==j)
 65                                           continue;
 66                                           if(data[i][j]>=MAXINT)
 67                                           continue;
 68                                           dis[k]=data[i][j];
 69                          k++;
 70                          }
 71                              
 72                              
 73                              sort(dis,dis+k);
 74                              
 75                                           
 76                                           
 77                              k=n*(n-1)*p;
 78                              
 79                              
 80                              
 81                              if(k%100==0)
 82                              k=k/100;
 83                              else
 84                              k=k/100+1;
 85                              
 86                            
 87                              
 88                              printf("Scenario #%d:\n%d\n\n",z,dis[k-1]);
 89 
 90                              
 91                              
 92         }
 93                          
 94                          
 95                          
 96                          
 97                                           
 98         
 99         
100         
101                   
102     
103    // system("PAUSE");
104     return EXIT_SUCCESS;
105 }

 

posted @ 2012-08-18 21:04  cseriscser  阅读(210)  评论(0编辑  收藏  举报