#include <iostream>
#include <set>
#include <vector>
struct Pas {
int wielkosc = 0;
int spadek = 0;
bool operator <(const Pas &pas) const {
return (3*wielkosc + spadek) < (3*pas.wielkosc + pas.spadek);
}
};
typedef std::vector<Pas> Pasy;
void wypisz(Pasy pasy) {
for (Pas &pas : pasy) {
std::cerr << "||" << pas.wielkosc << " Δ" << pas.spadek << std::endl;
}
std::cerr << std::endl;
}
int mastodont(const Pasy &pasy) {
int wynik = 0;
bool koniec = true;
int zaszczepionych = 0;
std::set<Pas> szczepione;
// wypisz(pasy);
for (int i = 0; i < pasy.size(); ++i) {
zaszczepionych += pasy[i].wielkosc;
if (pasy[i].spadek == 0 || pasy[i].wielkosc == 0 || szczepione.find(pasy[i]) != szczepione.end()) {
continue;
}
koniec = false;
szczepione.insert(Pas{pasy[i]});
Pasy nowepasy = pasy;
if (nowepasy[i].wielkosc == 1) {
nowepasy[i].spadek = 0;
} else {
nowepasy[i].spadek--;
}
for (Pas &pas : nowepasy) {
pas.wielkosc -= pas.spadek;
if (pas.wielkosc < 0) {
pas.wielkosc = 0;
}
}
int tu = mastodont(nowepasy);
if (wynik < tu) {
wynik = tu;
}
}
if (koniec && wynik < zaszczepionych) {
wynik = zaszczepionych;
}
return wynik;
}
void zaszczep() {
std::string miasta;
std::vector<Pas> pasy;
int miast;
std::cin >> miast >> miasta;
miasta = "2" + miasta + "2";
char poprzednie = '2';
for (char miasto : miasta) {
if (miasto == '0') {
if (poprzednie == '0') {
pasy.rbegin()->wielkosc++;
} else if (poprzednie == '1') {
pasy.push_back({1, 1});
} else if (poprzednie == '2') {
pasy.push_back({1, 0});
}
} else if (miasto == '1') {
if (poprzednie == '0') {
pasy.rbegin()->spadek++;
}
}
poprzednie = miasto;
}
// wypisz(pasy);
int wynik = mastodont(pasy);
std::cout << (miast - wynik) << std::endl;
}
int main() {
int testow;
std::cin >> testow;
for (int i = 0; i < testow; ++i) {
zaszczep();
}
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 | #include <iostream> #include <set> #include <vector> struct Pas { int wielkosc = 0; int spadek = 0; bool operator <(const Pas &pas) const { return (3*wielkosc + spadek) < (3*pas.wielkosc + pas.spadek); } }; typedef std::vector<Pas> Pasy; void wypisz(Pasy pasy) { for (Pas &pas : pasy) { std::cerr << "||" << pas.wielkosc << " Δ" << pas.spadek << std::endl; } std::cerr << std::endl; } int mastodont(const Pasy &pasy) { int wynik = 0; bool koniec = true; int zaszczepionych = 0; std::set<Pas> szczepione; // wypisz(pasy); for (int i = 0; i < pasy.size(); ++i) { zaszczepionych += pasy[i].wielkosc; if (pasy[i].spadek == 0 || pasy[i].wielkosc == 0 || szczepione.find(pasy[i]) != szczepione.end()) { continue; } koniec = false; szczepione.insert(Pas{pasy[i]}); Pasy nowepasy = pasy; if (nowepasy[i].wielkosc == 1) { nowepasy[i].spadek = 0; } else { nowepasy[i].spadek--; } for (Pas &pas : nowepasy) { pas.wielkosc -= pas.spadek; if (pas.wielkosc < 0) { pas.wielkosc = 0; } } int tu = mastodont(nowepasy); if (wynik < tu) { wynik = tu; } } if (koniec && wynik < zaszczepionych) { wynik = zaszczepionych; } return wynik; } void zaszczep() { std::string miasta; std::vector<Pas> pasy; int miast; std::cin >> miast >> miasta; miasta = "2" + miasta + "2"; char poprzednie = '2'; for (char miasto : miasta) { if (miasto == '0') { if (poprzednie == '0') { pasy.rbegin()->wielkosc++; } else if (poprzednie == '1') { pasy.push_back({1, 1}); } else if (poprzednie == '2') { pasy.push_back({1, 0}); } } else if (miasto == '1') { if (poprzednie == '0') { pasy.rbegin()->spadek++; } } poprzednie = miasto; } // wypisz(pasy); int wynik = mastodont(pasy); std::cout << (miast - wynik) << std::endl; } int main() { int testow; std::cin >> testow; for (int i = 0; i < testow; ++i) { zaszczep(); } return 0; } |
English