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; }