Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
Bitnami MediaWiki
Search
Search
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
4134 - Raza 1
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
Pe planeta Quadratia, locuitorii folosesc forme pătrate în tot ceea ce construiesc. Ei au trimis pe solul planetei <code>N</code> mașini speciale de apărare, numite '''rovere''', care se deplasează pe traiectorii ce descriu pătrate. Harta planetei poate fi privită ca un tablou bidimensional cu număr infinit de linii și coloane, numerotarea acestora începând cu <code>1</code>. Fiecare element al acestui tablou se identifică prin numărul liniei, respectiv numărul coloanei pe care se găsește. Fiecare rover este descris prin <code>3</code> numere naturale nenule <code>L</code>, <code>C</code> și <code>R</code>, reprezentând poziția (linia <code>L</code> și coloana <code>C</code>) elementului din colțul din stânga-sus al pătratului ce descrie traiectoria, respectiv lungimea <code>R</code> a laturii acestuia. Toate roverele pornesc inițial din elementul din colțul stânga-sus al pătratului ce descrie traiectoria, pe care o parcurg în sensul acelor de ceasornic, traversând câte un element pe secundă. Ele sunt programate să parcurgă această traiectorie fără a se opri. Este posibil ca mai multe rovere să se afle, la un moment dat, la aceeași poziție de pe hartă. Rectilinienii sunt singurii dușmani ai quadratienilor, ei deosebindu-se de aceștia prin folosirea consecventă a liniilor drepte în tot ceea ce construiesc. Rectilinienii au construit o armă laser de mare putere, pe care vor să o folosească la distrugerea roverelor quadratiene. Arma a fost adusă în poziția <code>(1,1)</code> de pe harta planetei, adică elementul de pe prima linie și prima coloană. Arma poate emite '''o singură''' rază distructivă, timp de o secundă, dezafectând în acest timp toate roverele aflate în secunda respectivă pe diagonala principală a tabloului care descrie harta planetei. Arma nu poate fi detectată în primele <code>S</code> secunde. Traiectoria roverelor poate trece prin poziția în care a fost amplasată arma, fără a o putea detecta în primele <code>S</code> secunde. În imagine avem două rovere, acestea fiind identificate prin tripletele de numere <code>4, 2, 6</code>, respectiv <code>6, 9, 4</code>. Traiectoria primului rover începe din poziția <code>(4, 2)</code> și are latura <code>6</code>. Numerele de pe traiectorie reprezintă secunda la care se parcurge respectivul element al tabloului. Roverul va ajunge din nou în poziția inițială la secundele <code>21, 41, 61, ...</code> Primul rover intersectează, la prima sa trecere, diagonala principală în două puncte: <code>(4, 4)</code> la secunda <code>3</code> și <code>(7, 7)</code> la secunda <code>9</code>. Al doilea rover intersectează diagonala principală într-un singur punct, <code>(9, 9)</code> la secundele <code>10, 22, 34, ...</code> = Cerința = Scrieţi un program care să rezolve următoarele cerințe: * Determină numărul roverelor a căror traiectorie se intersectează cu diagonala principală a tabloului ce descrie harta. * Determină numărul maxim de rovere, care pot fi distruse simultan, într-o singură secundă, înainte de trecerea celor <code>S</code> secunde, precum și secunda minimă în care se poate realiza acest lucru. = Date de intrare = Datele de intrare se citesc din fișierul <code>raza.in</code>, care are următoarea structură: * pe prima linie se află numărul natural <code>T ∈ {1, 2}</code>, semnificând numărul cerinței de rezolvat. * pe a doua linie se află numerele naturale nenule <code>N</code> și <code>S</code>, separate printr-un spațiu, reprezentând numărul roverelor, respectiv numărul de secunde în care arma nu este detectată. * pe următoarele <code>N</code> linii se află câte 3 numere naturale nenule, <code>L</code> <code>C</code> <code>R</code>, separate prin câte un spațiu, reprezentând coordonatele poziției inițiale, respectiv lungimea laturii traiectoriei fiecărui rover. = Date de ieșire = Datele de ieșire se vor afișa în fișierul <code>raza.out</code>, care are următoarea structură în funcție de cerință: * dacă <code>T = 1</code>, pe prima linie se va afișa numărul roverelor a căror traiectorie se intersectează cu diagonala principală; * dacă <code>T = 2</code>, pe prima linie se vor afișa două numere naturale, separate printr-un spațiu, reprezentând numărul maxim de rovere dezactivate și secunda minimă în care se poate realiza acest lucru. = Restricții și precizări = * <code>1 ≤ N ≤ 10.000</code> * <code>1 ≤ S ≤ 100.000</code> * <code>1 ≤ L, C ≤ 50.000</code> * <code>3 ≤ R ≤ 1000</code> * <code>1 ≤ Numărul maxim de rovere care se intersectează cu raza armei ≤ 1000</code>. * Pentru 28 de puncte, <code>T = 1</code> * Pentru 72 de puncte, <code>T = 2</code> = Exemplu: = <code>raza.in</code> 1 2 100 4 2 6 6 9 4 <code>raza.out</code> 2 === Explicație === Cerința este 1. Exemplul reprezintă desenul din enunț. <syntaxhighlight lang="python" line="1"> from collections import defaultdict def calculate_trajectory(L, C, R): trajectory = [] for t in range(4 * R): if t < R: trajectory.append((L, C + t)) elif t < 2 * R: trajectory.append((L + t - R, C + R - 1)) elif t < 3 * R: trajectory.append((L + R - 1, C + R - 1 - (t - 2 * R))) else: trajectory.append((L + R - 1 - (t - 3 * R), C)) return trajectory def solve(N, rovers, S): diagonal_intersections = defaultdict(list) for rover in rovers: L, C, R = rover trajectory = calculate_trajectory(L, C, R) for i, (x, y) in enumerate(trajectory): if x == y: t = i + 1 diagonal_intersections[t].append((L, C, R)) count_per_second = defaultdict(int) for t, rovers_at_t in diagonal_intersections.items(): if t <= S: count_per_second[t] += len(rovers_at_t) if not count_per_second: return 0, None, None max_destructions = max(count_per_second.values()) min_time = min(t for t in count_per_second if count_per_second[t] == max_destructions) return len(diagonal_intersections), max_destructions, min_time # Example usage N = 2 rovers = [(4, 2, 6), (6, 9, 4)] S = 10 print(solve(N, rovers, S)) </syntaxhighlight>
Summary:
Please note that all contributions to Bitnami MediaWiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Bitnami MediaWiki:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Toggle limited content width