1218. Episode N-th: The Jedi Tournament
Time limit: 1.0 second
Memory limit: 64 MB
Decided several Jedi Knights to organize a tournament once. To know, accumulates who the largest amount of Force. Brought each Jedi his lightsaber with him to the tournament. Are different the lightsaber, and Jedi different are. Three parameters there are: length of the saber, Force of the Jedi and how good the Light side of the Force the Jedi can use. If in at least two parameters one Jedi than the other one stronger is, wins he. Is not possible a draw, because no Jedi any equal parameter may have. If looses a Jedi, must leave the tournament he.
To determine, which Jedi the tournament can win, your program is. Can win the tournament a Jedi, if at least one schedule for the tournament possible is, when the last one remains he on the tournament, not looses any match. For example, if Anakin stronger than Luke by some two parameters is, and Luke stronger than Yoda by some two parameters is, and Yoda stronger than Anakin, exists in this case a schedule for every Jedi to win the tournament.
Input
In the first line there is a positive integer N ≤ 200, the total number of Jedi. After that followN lines, each line containing the name of the Jedi and three parameters (length of the lightsaber, Force, Light side in this order) separated with a space. The parameters are different integers, not greater than 100000 by the absolute value. All names are sequences of not more than 30 small and capital letters.
Output
Your program is to output the names of those Jedi, which have a possibility to win the tournament. Each name of the possible winner should be written in a separate line. The order of the names in the output should correspond to the order of their appearance in the input data.
Sample
input | output |
---|---|
5 Solo 0 0 0 Anakin 20 18 30 Luke 40 12 25 Kenobi 15 3 2 Yoda 35 9 125 |
Anakin Luke Yoda |
Problem Author: Leonid Volkov
Problem Source: The Seventh Ural State University collegiate programming contest
Tags: graph theory (hide tags for unsolved problems)
Difficulty: 338
题意:给出n个人,每个人有三个属性,一个人A比另一个人B优当且仅当A有至少两种属性不小于B的这两种属性,不存在两个人平局。问谁可能笑到最后?
注意,A优于B,B优于C,但C也可能优于A,此时A、B、C都可能笑到最后。
分析:就是说给出n个点,让你建出很多有向边I,j代表i优于j,最后问有多少点能访问全部点
floyd就好
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <deque> 6 #include <vector> 7 #include <queue> 8 #include <iostream> 9 #include <algorithm> 10 #include <map> 11 #include <set> 12 #include <ctime> 13 using namespace std; 14 typedef long long LL; 15 typedef double DB; 16 #define For(i, s, t) for(int i = (s); i <= (t); i++) 17 #define Ford(i, s, t) for(int i = (s); i >= (t); i--) 18 #define Rep(i, t) for(int i = (0); i < (t); i++) 19 #define Repn(i, t) for(int i = ((t)-1); i >= (0); i--) 20 #define rep(i, x, t) for(int i = (x); i < (t); i++) 21 #define MIT (2147483647) 22 #define INF (1000000001) 23 #define MLL (1000000000000000001LL) 24 #define sz(x) ((int) (x).size()) 25 #define clr(x, y) memset(x, y, sizeof(x)) 26 #define puf push_front 27 #define pub push_back 28 #define pof pop_front 29 #define pob pop_back 30 #define ft first 31 #define sd second 32 #define mk make_pair 33 inline void SetIO(string Name) { 34 string Input = Name+".in", 35 Output = Name+".out"; 36 freopen(Input.c_str(), "r", stdin), 37 freopen(Output.c_str(), "w", stdout); 38 } 39 40 inline int Getint() { 41 int Ret = 0; 42 char Ch = ‘ ‘; 43 while(!(Ch >= ‘0‘ && Ch <= ‘9‘)) Ch = getchar(); 44 while(Ch >= ‘0‘ && Ch <= ‘9‘) { 45 Ret = Ret*10+Ch-‘0‘; 46 Ch = getchar(); 47 } 48 return Ret; 49 } 50 51 const int N = 210; 52 struct JediType { 53 string Name; 54 int a, b, c; 55 56 inline void Read() { 57 cin>>Name; 58 scanf("%d%d%d", &a, &b, &c); 59 } 60 61 inline bool operator >(const JediType &T) const { 62 return ((a >= T.a)+(b >= T.b)+(c >= T.c)) >= 2; 63 } 64 } Jedi[N]; 65 int n; 66 bool F[N][N]; 67 68 inline void Input() { 69 scanf("%d", &n); 70 For(i, 1, n) Jedi[i].Read(); 71 } 72 73 inline void Solve() { 74 For(i, 1, n) 75 For(j, 1, n) 76 if(Jedi[i] > Jedi[j]) 77 F[i][j] = 1; 78 79 For(k, 1, n) 80 For(i, 1, n) 81 For(j, 1, n) 82 F[i][j] |= F[i][k]&F[k][j]; 83 84 For(i, 1, n) { 85 bool Flag = 1; 86 For(j, 1, n) 87 if(!F[i][j]) { 88 Flag = 0; 89 break; 90 } 91 if(Flag) cout<<Jedi[i].Name<<endl; 92 } 93 } 94 95 int main() { 96 #ifndef ONLINE_JUDGE 97 SetIO("C"); 98 #endif 99 Input(); 100 Solve(); 101 return 0; 102 }