#include <iostream> using namespace std; int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int n; std::cin>>n; int odpowiedz[n][4]; int licznik_i=0, licznik_j=0; int poziome[n]; int pionowe[n]; //pobranie danych samochodow, sprawdzenie i zapisanie ich kierunku for(int i=0; i<n; i++) { std::cin>>odpowiedz[i][0]>>odpowiedz[i][1]>>odpowiedz[i][2]; odpowiedz[i][3]=0; if(odpowiedz[i][0]==1) { pionowe[licznik_i]=i; licznik_i++; } else { poziome[licznik_j]=i; licznik_j++; } } //sprwadzenie czy nie sa to tylko poziome albo pionowe drogi if(licznik_i==0 || licznik_j==0) { std::cout<<"0"; return 0; } int czas1, czas2; int ilosc_kolizji=0; int kolizje[(n/2)*(n/2)][2]; int najwiecej[3]; najwiecej[1]=0; //dla kazdej poziomej drogi sprawdzic czy nastepuje kolizja z pionowa for(int l=0; l<licznik_j; l++) { for(int k=0; k<licznik_i; k++) { czas1=odpowiedz[pionowe[k]][1]+odpowiedz[poziome[l]][2]; czas2=odpowiedz[poziome[l]][1]+odpowiedz[pionowe[k]][2]; if(czas1==czas2) { odpowiedz[poziome[l]][3]++; if(odpowiedz[poziome[l]][3]>najwiecej[1]) { najwiecej[0]=poziome[l]; najwiecej[1]=odpowiedz[poziome[l]][3]; najwiecej[2]=0; } odpowiedz[pionowe[k]][3]++; if(odpowiedz[pionowe[k]][3]>najwiecej[1]) { najwiecej[0]=pionowe[k]; najwiecej[1]=odpowiedz[pionowe[k]][3]; najwiecej[2]=1; } kolizje[ilosc_kolizji][0]=poziome[l]; kolizje[ilosc_kolizji][1]=pionowe[k]; ilosc_kolizji++; } } } //jesli nie ma zadnych kolizji if(ilosc_kolizji==0) { std::cout<<"0"; return 0; } //program ktory bedzie zmniejszac ilosc kolizji i naliczac ile trzeba usunac int ile_odwolac=0; int abc=ilosc_kolizji; while(ilosc_kolizji>0) { if(najwiecej[2]==0) { //program ktory bedzie znajdywal powiazane z nim kolizje i usuwal jes z odpowiedzi oraz zamienial jes na li //numer samochodu jesli gorne int c=0, b=0; while(c<najwiecej[1] || b<abc) { //jesli znajdziemy kolizje pomiedzy te i inna od obu w odpowiedziach odejmujemy 1 if(kolizje[b][0]==najwiecej[0]) { odpowiedz[kolizje[b][1]][3]--; odpowiedz[kolizje[b][0]][3]--; kolizje[b][1]=kolizje[b][0]; c++; } b++; } } else { int c=0, b=0; while(c<najwiecej[1] || b<abc) { //lub jesli dolne //jesli znajdziemy kolizje pomiedzy te i inna od obu w odpowiedziach odejmujemy 1 if(kolizje[b][1]==najwiecej[0]) { odpowiedz[kolizje[b][1]][3]--; odpowiedz[kolizje[b][0]][3]--; kolizje[b][0]=kolizje[b][1]; c++; } b++; } } ilosc_kolizji-=najwiecej[1]; ile_odwolac++; najwiecej[1]=0; //znalezienie kolejnego samochodu z najwieksza liczba kolizji w tablicy odpowiedzi if(ilosc_kolizji>0) { for(int m=0; m<n; m++) { if(odpowiedz[m][3]>najwiecej[1]) { najwiecej[0]=m; najwiecej[1]=odpowiedz[m][3]; najwiecej[2]=-(odpowiedz[m][0])+2; } } } } std::cout<<ile_odwolac; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | #include <iostream> using namespace std; int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int n; std::cin>>n; int odpowiedz[n][4]; int licznik_i=0, licznik_j=0; int poziome[n]; int pionowe[n]; //pobranie danych samochodow, sprawdzenie i zapisanie ich kierunku for(int i=0; i<n; i++) { std::cin>>odpowiedz[i][0]>>odpowiedz[i][1]>>odpowiedz[i][2]; odpowiedz[i][3]=0; if(odpowiedz[i][0]==1) { pionowe[licznik_i]=i; licznik_i++; } else { poziome[licznik_j]=i; licznik_j++; } } //sprwadzenie czy nie sa to tylko poziome albo pionowe drogi if(licznik_i==0 || licznik_j==0) { std::cout<<"0"; return 0; } int czas1, czas2; int ilosc_kolizji=0; int kolizje[(n/2)*(n/2)][2]; int najwiecej[3]; najwiecej[1]=0; //dla kazdej poziomej drogi sprawdzic czy nastepuje kolizja z pionowa for(int l=0; l<licznik_j; l++) { for(int k=0; k<licznik_i; k++) { czas1=odpowiedz[pionowe[k]][1]+odpowiedz[poziome[l]][2]; czas2=odpowiedz[poziome[l]][1]+odpowiedz[pionowe[k]][2]; if(czas1==czas2) { odpowiedz[poziome[l]][3]++; if(odpowiedz[poziome[l]][3]>najwiecej[1]) { najwiecej[0]=poziome[l]; najwiecej[1]=odpowiedz[poziome[l]][3]; najwiecej[2]=0; } odpowiedz[pionowe[k]][3]++; if(odpowiedz[pionowe[k]][3]>najwiecej[1]) { najwiecej[0]=pionowe[k]; najwiecej[1]=odpowiedz[pionowe[k]][3]; najwiecej[2]=1; } kolizje[ilosc_kolizji][0]=poziome[l]; kolizje[ilosc_kolizji][1]=pionowe[k]; ilosc_kolizji++; } } } //jesli nie ma zadnych kolizji if(ilosc_kolizji==0) { std::cout<<"0"; return 0; } //program ktory bedzie zmniejszac ilosc kolizji i naliczac ile trzeba usunac int ile_odwolac=0; int abc=ilosc_kolizji; while(ilosc_kolizji>0) { if(najwiecej[2]==0) { //program ktory bedzie znajdywal powiazane z nim kolizje i usuwal jes z odpowiedzi oraz zamienial jes na li //numer samochodu jesli gorne int c=0, b=0; while(c<najwiecej[1] || b<abc) { //jesli znajdziemy kolizje pomiedzy te i inna od obu w odpowiedziach odejmujemy 1 if(kolizje[b][0]==najwiecej[0]) { odpowiedz[kolizje[b][1]][3]--; odpowiedz[kolizje[b][0]][3]--; kolizje[b][1]=kolizje[b][0]; c++; } b++; } } else { int c=0, b=0; while(c<najwiecej[1] || b<abc) { //lub jesli dolne //jesli znajdziemy kolizje pomiedzy te i inna od obu w odpowiedziach odejmujemy 1 if(kolizje[b][1]==najwiecej[0]) { odpowiedz[kolizje[b][1]][3]--; odpowiedz[kolizje[b][0]][3]--; kolizje[b][0]=kolizje[b][1]; c++; } b++; } } ilosc_kolizji-=najwiecej[1]; ile_odwolac++; najwiecej[1]=0; //znalezienie kolejnego samochodu z najwieksza liczba kolizji w tablicy odpowiedzi if(ilosc_kolizji>0) { for(int m=0; m<n; m++) { if(odpowiedz[m][3]>najwiecej[1]) { najwiecej[0]=m; najwiecej[1]=odpowiedz[m][3]; najwiecej[2]=-(odpowiedz[m][0])+2; } } } } std::cout<<ile_odwolac; return 0; } |