✅ (wip) P7078 15pts (WA+TLE)
This commit is contained in:
		| @@ -22,4 +22,5 @@ add_executable(Playground | |||||||
|         sudoku/main.cc |         sudoku/main.cc | ||||||
|         take-most-space-element/main.cc |         take-most-space-element/main.cc | ||||||
|         walking-in-maze/main.cc |         walking-in-maze/main.cc | ||||||
|         network-connection/main.cpp) |         network-connection/main.cpp | ||||||
|  |         eating-snake/main.cc) | ||||||
|   | |||||||
							
								
								
									
										5
									
								
								eating-snake/data.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								eating-snake/data.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | 2 | ||||||
|  | 3 | ||||||
|  | 11 14 14 | ||||||
|  | 3 | ||||||
|  | 1 5 2 6 3 25 | ||||||
							
								
								
									
										5
									
								
								eating-snake/data2.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								eating-snake/data2.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | 2 | ||||||
|  | 5 | ||||||
|  | 13 31 33 39 42 | ||||||
|  | 5 | ||||||
|  | 1 7 2 10 3 24 4 48 5 50 | ||||||
							
								
								
									
										21
									
								
								eating-snake/data3.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								eating-snake/data3.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | 10 | ||||||
|  | 3 | ||||||
|  | 29 46 67  | ||||||
|  | 3 | ||||||
|  | 1 15 2 34 3 114  | ||||||
|  | 3 | ||||||
|  | 1 120 2 168 3 224  | ||||||
|  | 3 | ||||||
|  | 1 65 2 132 3 293  | ||||||
|  | 3 | ||||||
|  | 1 79 2 192 3 474  | ||||||
|  | 3 | ||||||
|  | 1 24 2 64 3 562  | ||||||
|  | 3 | ||||||
|  | 1 396 2 458 3 595  | ||||||
|  | 3 | ||||||
|  | 1 44 2 317 3 592  | ||||||
|  | 3 | ||||||
|  | 1 138 2 145 3 572  | ||||||
|  | 3 | ||||||
|  | 1 602 2 726 3 831  | ||||||
							
								
								
									
										144
									
								
								eating-snake/data3.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								eating-snake/data3.out
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,144 @@ | |||||||
|  | eating log:  | ||||||
|  | (3, 67) | ||||||
|  | eating log:  | ||||||
|  | (2, 46) | ||||||
|  | eating log:  | ||||||
|  | (1, 29) | ||||||
|  | 3 gonna to eat 1 | ||||||
|  | 3 give up, cuz it will be eaten after ate that snake, new strongest snake 2 | ||||||
|  | 3 | ||||||
|  | alter log:  | ||||||
|  | 1 2 3  | ||||||
|  | eating log:  | ||||||
|  | (3, 114) | ||||||
|  | eating log:  | ||||||
|  | (2, 34) | ||||||
|  | eating log:  | ||||||
|  | (1, 15) | ||||||
|  | 3 gonna to eat 1 | ||||||
|  | 3 has ate 1 | ||||||
|  | eating log:  | ||||||
|  | (3, 99) | ||||||
|  | eating log:  | ||||||
|  | (2, 34) | ||||||
|  | 3 gonna to eat 2 | ||||||
|  | 3 has ate 2 | ||||||
|  | 1 | ||||||
|  | alter log:  | ||||||
|  | 3  | ||||||
|  | eating log:  | ||||||
|  | (3, 224) | ||||||
|  | eating log:  | ||||||
|  | (2, 168) | ||||||
|  | eating log:  | ||||||
|  | (3, 120) | ||||||
|  | 3 gonna to eat 3 | ||||||
|  | 3 give up, cuz it will be eaten after ate that snake, new strongest snake 2 | ||||||
|  | 3 | ||||||
|  | alter log:  | ||||||
|  | 2 3 3  | ||||||
|  | eating log:  | ||||||
|  | (3, 293) | ||||||
|  | eating log:  | ||||||
|  | (3, 132) | ||||||
|  | eating log:  | ||||||
|  | (2, 65) | ||||||
|  | 3 gonna to eat 2 | ||||||
|  | 3 has ate 2 | ||||||
|  | eating log:  | ||||||
|  | (3, 228) | ||||||
|  | eating log:  | ||||||
|  | (3, 132) | ||||||
|  | 3 gonna to eat 3 | ||||||
|  | 3 has ate 3 | ||||||
|  | 1 | ||||||
|  | alter log:  | ||||||
|  | 3  | ||||||
|  | eating log:  | ||||||
|  | (3, 474) | ||||||
|  | eating log:  | ||||||
|  | (2, 192) | ||||||
|  | eating log:  | ||||||
|  | (3, 79) | ||||||
|  | 3 gonna to eat 3 | ||||||
|  | 3 has ate 3 | ||||||
|  | eating log:  | ||||||
|  | (3, 395) | ||||||
|  | eating log:  | ||||||
|  | (2, 192) | ||||||
|  | 3 gonna to eat 2 | ||||||
|  | 3 has ate 2 | ||||||
|  | 1 | ||||||
|  | alter log:  | ||||||
|  | 3  | ||||||
|  | eating log:  | ||||||
|  | (3, 562) | ||||||
|  | eating log:  | ||||||
|  | (2, 64) | ||||||
|  | eating log:  | ||||||
|  | (3, 24) | ||||||
|  | 3 gonna to eat 3 | ||||||
|  | 3 has ate 3 | ||||||
|  | eating log:  | ||||||
|  | (3, 538) | ||||||
|  | eating log:  | ||||||
|  | (2, 64) | ||||||
|  | 3 gonna to eat 2 | ||||||
|  | 3 has ate 2 | ||||||
|  | 1 | ||||||
|  | alter log:  | ||||||
|  | 3  | ||||||
|  | eating log:  | ||||||
|  | (3, 595) | ||||||
|  | eating log:  | ||||||
|  | (2, 458) | ||||||
|  | eating log:  | ||||||
|  | (3, 396) | ||||||
|  | 3 gonna to eat 3 | ||||||
|  | 3 give up, cuz it will be eaten after ate that snake, new strongest snake 2 | ||||||
|  | 3 | ||||||
|  | alter log:  | ||||||
|  | 2 3 3  | ||||||
|  | eating log:  | ||||||
|  | (3, 592) | ||||||
|  | eating log:  | ||||||
|  | (3, 317) | ||||||
|  | eating log:  | ||||||
|  | (2, 44) | ||||||
|  | 3 gonna to eat 2 | ||||||
|  | 3 has ate 2 | ||||||
|  | eating log:  | ||||||
|  | (3, 548) | ||||||
|  | eating log:  | ||||||
|  | (3, 317) | ||||||
|  | 3 gonna to eat 3 | ||||||
|  | 3 has ate 3 | ||||||
|  | 1 | ||||||
|  | alter log:  | ||||||
|  | 3  | ||||||
|  | eating log:  | ||||||
|  | (3, 572) | ||||||
|  | eating log:  | ||||||
|  | (2, 145) | ||||||
|  | eating log:  | ||||||
|  | (3, 138) | ||||||
|  | 3 gonna to eat 3 | ||||||
|  | 3 has ate 3 | ||||||
|  | eating log:  | ||||||
|  | (3, 434) | ||||||
|  | eating log:  | ||||||
|  | (2, 145) | ||||||
|  | 3 gonna to eat 2 | ||||||
|  | 3 has ate 2 | ||||||
|  | 1 | ||||||
|  | alter log:  | ||||||
|  | 3  | ||||||
|  | eating log:  | ||||||
|  | (3, 831) | ||||||
|  | eating log:  | ||||||
|  | (2, 726) | ||||||
|  | eating log:  | ||||||
|  | (3, 602) | ||||||
|  | 3 gonna to eat 3 | ||||||
|  | 3 give up, cuz it will be eaten after ate that snake, new strongest snake 2 | ||||||
|  | 3 | ||||||
							
								
								
									
										142
									
								
								eating-snake/main.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								eating-snake/main.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,142 @@ | |||||||
|  | #include <iostream> | ||||||
|  | #include <vector> | ||||||
|  | #include <algorithm> | ||||||
|  |  | ||||||
|  | using namespace std; | ||||||
|  |  | ||||||
|  | //#define ENABLE_LOG | ||||||
|  |  | ||||||
|  | struct snake { | ||||||
|  |     int id; | ||||||
|  |     int power; | ||||||
|  |  | ||||||
|  |     snake(int id, int power) { | ||||||
|  |         this->id = id; | ||||||
|  |         this->power = power; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     bool operator<(const snake &obj) const { | ||||||
|  |         if (obj.power == power) return obj.id < id; | ||||||
|  |         return obj.power < power; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     bool operator>=(const snake &obj) const { | ||||||
|  |         return power >= obj.power; | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | bool sort_by_id(snake a, snake b) { | ||||||
|  |     return b.id > a.id; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void eat(vector<snake> &vec, bool skip_sort = false) { | ||||||
|  |     if (vec.size() < 2) return; | ||||||
|  |     if (!skip_sort) { | ||||||
|  |         sort(vec.begin(), vec.end()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | #if defined(ENABLE_LOG) | ||||||
|  |     for (auto item: vec) { | ||||||
|  |         printf("eating log: \n"); | ||||||
|  |         printf("(%d, %d)\n", item.id, item.power); | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     if (!(vec[0] >= vec[vec.size() - 1])) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // If this snake ate the last snake | ||||||
|  |     snake curr = vec[0]; | ||||||
|  |     snake last = vec[vec.size() - 1]; | ||||||
|  | #if defined(ENABLE_LOG) | ||||||
|  |     printf("%d gonna to eat %d\n", curr.id, last.id); | ||||||
|  | #endif | ||||||
|  |     vec.pop_back(); | ||||||
|  |     vec[0].power -= last.power; | ||||||
|  |     sort(vec.begin(), vec.end()); | ||||||
|  |     if (vec[0].id != curr.id) { | ||||||
|  |         bool will_be_eaten = false; | ||||||
|  |         int strongest_curr_power = vec[0].power; | ||||||
|  |         // Looking up if current snake will be eaten | ||||||
|  |         for (auto it = vec.rbegin(); it < vec.rend(); it++) { | ||||||
|  |             if (strongest_curr_power >= it->power) { | ||||||
|  |                 if (it->id == curr.id) { | ||||||
|  |                     // So bad, the new strongest snake will eat the current strongest snake | ||||||
|  |                     // Give up eating right now! | ||||||
|  |                     will_be_eaten = true; | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |                 // No more thinking, just go for it | ||||||
|  |                 strongest_curr_power -= it->power; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (will_be_eaten) { | ||||||
|  | #if defined(ENABLE_LOG) | ||||||
|  |             printf("%d give up, cuz it will be eaten after ate that snake, new strongest snake %d\n", curr.id, | ||||||
|  |                    vec[0].id); | ||||||
|  | #endif | ||||||
|  |             // It means the current snake going to be eaten | ||||||
|  |             // Revert the action | ||||||
|  |             for (auto &item: vec) { | ||||||
|  |                 if (item.id == curr.id) { | ||||||
|  |                     item.power = curr.power; | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             vec.push_back(last); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | #if defined(ENABLE_LOG) | ||||||
|  |     printf("%d has ate %d\n", curr.id, last.id); | ||||||
|  | #endif | ||||||
|  |     // Else, it means the current snake is still strong enough | ||||||
|  |     // Going to see other snakes can be eaten... | ||||||
|  |     return eat(vec, skip_sort = true); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int main() { | ||||||
|  |     int count; | ||||||
|  |     cin >> count; | ||||||
|  |  | ||||||
|  |     vector<snake> snakes; | ||||||
|  |     int t; | ||||||
|  |     cin >> t; | ||||||
|  |     for (int i = 0; i < t; i++) { | ||||||
|  |         int a; | ||||||
|  |         cin >> a; | ||||||
|  |         snakes.emplace_back(i + 1, a); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     eat(snakes); | ||||||
|  |     cout << snakes.size() << endl; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < count - 1; i++) { | ||||||
|  |         int n; | ||||||
|  |         cin >> n; | ||||||
|  |         sort(snakes.begin(), snakes.end(), sort_by_id); | ||||||
|  | #if defined(ENABLE_LOG) | ||||||
|  |         printf("alter log: \n"); | ||||||
|  |         for (const auto &item: snakes) { | ||||||
|  |             printf("%d ", item.id); | ||||||
|  |         } | ||||||
|  |         printf("\n"); | ||||||
|  | #endif | ||||||
|  |         for (int j = 0; j < n; j++) { | ||||||
|  |             int id, alter; | ||||||
|  |             cin >> id >> alter; | ||||||
|  |             if (snakes.size() < id) { | ||||||
|  |                 // Respawn | ||||||
|  |                 snakes.emplace_back(id, alter); | ||||||
|  |             } else { | ||||||
|  |                 // Alter power | ||||||
|  |                 snakes[id - 1].power = alter; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         eat(snakes); | ||||||
|  |         cout << snakes.size() << endl; | ||||||
|  |     } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user