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
1497 - Nunta
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!
== Enunț == La o nuntă sunt invitate <code>n</code> persoane, numerotate de la <code>1</code> la <code>n</code>. Se știe că o parte din ele se cunosc două câte două, fie că sunt rude, fie de la serviciu, fie sunt prieteni sau vecini. Astfel se vor forma un număr <code>K</code> minim de grupuri astfel încât în fiecare grup, fiecare persoană să aibă cel puţin un cunoscut. Pentru fiecare grup de cel puțin două persoane se stabileşte un lider – persoana cu numărul de ordine minim. Aceste grupuri vor fi numerotate de la <code>1</code> la <code>K</code> în ordinea crescătoare a numerelor de ordine ale liderilor. Ca sa se ivească cât mai puține situații stânjenitoare, organizatorul nunții ar dori să aranjeze o masă principală cu cel puţin <code>n/2+1</code> invitaţi, la care să fie aşezate unul sau mai multe astfel de grupuri întregi numerotate cu valori consecutive. = Cerința = Fiind date <code>n</code>, numărul de persoane, <code>m</code>, numărul de perechi de invitaţi care se cunosc între ei și cele <code>m</code> perechi, să se determine numărul <code>K</code> minim de grupuri formate din cel puțin doi invitați astfel încât, în fiecare grup, fiecare persoană să aibă cel puţin un cunoscut, precum şi numărul variantelor distincte în care se poate organiza masa cu cel puţin <code>n/2+1</code> invitaţi din grupurile formate. = Date de intrare = Fișierul de intrare <code>nuntaIN.txt</code> conține pe prima linie două numere naturale separate prin spațiu <code>n</code> și <code>m</code>, <code>n</code> reprezentând numărul de invitaţi, respectiv <code>m</code> numărul de perechi de invitaţi care se cunosc între ei. Pe fiecare din următoarele <code>m</code> linii se află câte două numere naturale <code>x</code> și <code>y</code>, <code>1≤x</code>, <code>y≤n</code>, separate printr-un spațiu, cu semnificația că invitaţii <code>x</code> și <code>y</code> se cunosc între ei. = Date de ieșire = Fișierul de ieșire <code>nuntaOUT.txt</code> va conține pe prima linie un număr natural <code>g</code> reprezentând numărul minim de grupuri formate din cel puțin doi invitați astfel încât, în fiecare grup, fiecare persoană să aibă cel puţin un cunoscut. Pe cea de a doua linie va fi scris un număr natural <code>v</code> reprezentând numărul variantelor distincte în care se poate organiza masa cu cel puţin <code>n/2+1</code> invitaţi din grupurile formate.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse". = Restricții și precizări = * <code>0 < n <= 20000</code> * <code>0 < m <= 100000</code> = Exemplul 1: = <code>nuntaIN.txt</code> 31 6 5 7 2 3 10 14 14 6 9 15 7 30 <code>nuntaOUT.txt</code> 4 0 === Explicație === Grupurile formate din cel puțin doi invitați sunt : <code>(2,3)</code>, <code>(5,7,30)</code>, <code>(6,10,14)</code>, <code>(9,15)</code>, deci <code>K=4</code>. Ele nu sunt suficiente pentru a forma o masă cu cel puţin <code>16</code> invitaţi, deci sunt <code>0</code> variante de aranjare. == Exemplul 1: == <code>nuntaIN.txt</code> 20001 6 5 7 2 3 10 14 14 6 9 15 7 30 <code>nuntaOUT.txt</code> Datele nu corespund restrictiilor impuse == Rezolvare == <syntaxhighlight lang="python3" line="1"> from collections import namedtuple nMAX = 20000 class Component: def __init__(self): self.min = float('inf') self.cnt = 0 components = [Component() for _ in range(nMAX + 1)] gf = [[] for _ in range(nMAX + 1)] viz = [0] * (nMAX + 1) def check_constraints(n, m): if not (0 < n <= 20000) or not (0 < m <= 100000): with open("nuntaOUT.txt", "w") as fout: fout.write("Datele nu corespund restrictiilor impuse") return False return True def dfs(nod, fil): viz[nod] = fil for nex in gf[nod]: if not viz[nex]: dfs(nex, fil) def main(): global nMAX global gf global viz global components with open("nuntaIN.txt", "r") as fin: n, m = map(int, fin.readline().split()) if not check_constraints(n, m): return with open("nuntaOUT.txt", "w") as fout: for _ in range(m): a, b = map(int, fin.readline().split()) gf[a].append(b) gf[b].append(a) fil = 0 for i in range(1, n + 1): if not viz[i]: fil += 1 dfs(i, fil) for i in range(1, n + 1): components[i].min = float('inf') for i in range(1, n + 1): components[viz[i]].min = min(components[viz[i]].min, i) components[viz[i]].cnt += 1 components = sorted(components[1:fil + 1], key=lambda x: (x.cnt == 1, x.min)) while components[fil - 1].cnt == 1: fil -= 1 fout.write(str(fil) + '\n') dr = 0 s = 0 ne = 0 for st in range(1, fil + 1): while dr + 1 <= fil and s + components[dr].cnt < n // 2 + 1: s += components[dr].cnt dr += 1 if s + components[dr].cnt < n // 2 + 1: break ne += fil - dr s -= components[st - 1].cnt fout.write(str(ne)) if __name__ == "__main__": main() </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