Komunikacja

Transkrypt

Komunikacja
Komunikacja - koty ————————————————————————————————
#include <iostream> #include <vector> using namespace std;
vector<vector<int> > L;
vector<bool> B;
int n;
// lista sąsiedztwa
// wierzchołki odwiedzone / nieodwiedzone
int DFS(int i) {
B[i] = true;
int licznik = 1;
for (int j=0; j<L[i].size(); j++) {
int v = L[i][j];
if (!B[v]) licznik += DFS(v);
}
return licznik;
}
// zwraca liczbę miast w spójnej składowej grafu
int main() {
cin >> n;
// liczba miast
int m,k;
// krawedzie istniejące i nowe
cin >> m >> k;
L.resize(n+1);
B.resize(n+1,false);
int a,b;
for (int i=0; i<m; i++) {
cin >> a >> b;
L[a].push_back(b);
L[b].push_back(a);
}
vector<int> Q;
// liczby miast w poszczególnych spójnych składowych
int zostalo = n;
// ile miast grafu nie jest jeszcze przyłączonych do żadnej spójnej składowej
do {
int i = 1;
while (i<n && B[i]) i++; // znajdź pierwsze miasto, które nie jest jeszcze odwiedzone
int q = DFS(i); // zapuść z niego DFS, aby znaleźć całą spójną składową do której ono należy
//cout << q << " miast spójnych"<< endl;
// q - to jest liczba miast w tej spójnej składowej
Q.push_back(q);
zostalo -= q;
} while (zostalo>0);
sort(Q.begin(),Q.end());
for (int i=0; i<k; i++) {
int q = Q.size();
Q[q-2] += Q[q-1];
Q.pop_back();
}
int pary = 0;
for (int i=0; i<Q.size(); i++){
int q = Q[i];
pary += q*(q-1)/2;
}
cout << pary << endl;
return 0;
}
// posortuj spójne składowe względem ich liczebności
// zbuduj nową drogę łaczącą dwie najlicznijejsze spójne składowe
// czyli połącz dwie najliczniejsze składowe
// i usuń z wektora Q ostatnią pozycję, // która została dołaczona do przedostatniej
Masz zbiór q-elementowy.
Liczba różnych par elementów, jakie można
utworzyć w tym zbiorze = q*(q-1)/2
Kierownica —————————————————————————————————// Znajdź minimalną sumę na trasie od (0,0) do (n-1,m-1), wykonując najwyżej 2 skręty
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n,m;
cin >> n >> m;
vector<int>SG(m,0), SD(m,0), KOL(n,0); // wiersz górny, dolny i kolumna
for (int j=0; j<m; j++) {
cin >> SG[j];
KOL[j] = SG[j];
}
int s;
for (int i=1; i<n-1; i++)
for (int j=0; j<m; j++) {
cin >> s;
KOL[j] += s;
}
for (int j=0; j<m; j++) {
cin >> SD[j];
KOL[j] += SD[j];
}
// czytaj wiersz górny
// zmienna pomocnicza, wartość w bieżącym skrzyżowaniu
// czytaj wiersze pośrednie
// czytaj wiersz dolny
int smin = n*m;
// wartownik minimalnej liczby świateł
for (int j=0; j<m; j++) {
int swiatla = 0;
if (j>0) {
// górny wiersz
for (int k=0; k<j; k++) swiatla += SG[k];
}
swiatla += KOL[j];
// kolumna
if (j<m-1) {
// dolny wiersz
for (int k=j+1; k<m; k++) swiatla += SD[k];
}
if (swiatla<smin) smin = swiatla;
}
cout << smin << endl;
return 0;
}
Śnieżynki —————————————————————————————————#include <iostream>
using namespace std;
int sniezynki(int n) {
if (n<2) return 0;
int patyki, liscie, licznik;
licznik = 0;
int startowe = 2;
while (startowe <= n/3) {
patyki = liscie = startowe;
while (true) {
int nowa = patyki + 2*liscie;
liscie *=2;
if (nowa<n) patyki = nowa;
else
if (nowa==n) {
licznik++;
break;
}
else break;
// w drugim kroku trzeba bedzie dołożyć 2*tyle co na starcie
// gwiazda początkowa
// na każdym poprzednim liściu dokładamy 2 patyki
// z kazdego liścia powstają dwa nowe liście
// buduj dalej tę śnieżynkę, nie wykorzystano jeszcze patyków
// jest śnieżynka z dokładnie n patyków
// nie da się zrobić tej śnieżynki, potrzeba więcej niż n patyków
}
startowe++;
}
return licznik;
}
int main() {
int t, n;
cin >> t;
for (int i=0; i<t; i++) {
cin >> n;
cout << sniezynki(n) << endl;
}
return 0;
}
Bilboardy ——————————————————————————————————#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
// liczba miast
cin >> n;
vector<int> S(n); // samochody startujące w poszczególnych miastach
for (int i=1; i<n; i++) cin >> S[i];
int s, z, p;
s = S[1];
p = s;
cout << p << " ";
// liczba samochodów startujących, zatrzymujących się, przejeżdżających
for (int i=2; i<n; i++) {
cin >> z;
p = p - z + S[i];
cout << p << " ";
}
cout << endl;
return 0;
}