#include<bits/stdc++.h> using namespace std; struct TownGroup{ int numberOfTowns; int infectedNeighbours; double proportion; TownGroup(int numberOfTowns, int infectedNeighbours){ this->numberOfTowns = numberOfTowns; if(infectedNeighbours == 0){ proportion = numberOfTowns; this->infectedNeighbours = 1; } else{ this->infectedNeighbours = infectedNeighbours; proportion = 1.0*numberOfTowns/infectedNeighbours; } } int calcValue(int time){ int calc = numberOfTowns-infectedNeighbours*time; if(calc > 1) calc -= (infectedNeighbours-1); return calc; } }; bool townGroupPriority(TownGroup * fst, TownGroup * snd){ return fst->proportion > snd->proportion; } int main(){ ios_base::sync_with_stdio(0); int t; cin >> t; while(t--){ int n; cin >> n; string s; cin >> s; int current_healthy_town_counter = 0; int infected_neighbours = 0; if(s[0] == '1') infected_neighbours = 1; vector<TownGroup*> town_groups; for(int i=0; i<n; i++){ if(s[i] == '0'){ ++current_healthy_town_counter; } else if(s[i] == '1' && current_healthy_town_counter > 0){ town_groups.push_back(new TownGroup(current_healthy_town_counter, infected_neighbours+1)); current_healthy_town_counter = 0; infected_neighbours = 1; } } if(current_healthy_town_counter > 0){ town_groups.push_back(new TownGroup(current_healthy_town_counter, infected_neighbours)); } sort(town_groups.begin(), town_groups.end(), townGroupPriority); int time = 0, result = 0; for(int i=0; i<town_groups.size(); i++){ TownGroup * current_town_group = town_groups[i]; result += max(0, current_town_group->calcValue(time)); time += current_town_group->infectedNeighbours; delete current_town_group; } cout << n-result << "\n"; } }
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 | #include<bits/stdc++.h> using namespace std; struct TownGroup{ int numberOfTowns; int infectedNeighbours; double proportion; TownGroup(int numberOfTowns, int infectedNeighbours){ this->numberOfTowns = numberOfTowns; if(infectedNeighbours == 0){ proportion = numberOfTowns; this->infectedNeighbours = 1; } else{ this->infectedNeighbours = infectedNeighbours; proportion = 1.0*numberOfTowns/infectedNeighbours; } } int calcValue(int time){ int calc = numberOfTowns-infectedNeighbours*time; if(calc > 1) calc -= (infectedNeighbours-1); return calc; } }; bool townGroupPriority(TownGroup * fst, TownGroup * snd){ return fst->proportion > snd->proportion; } int main(){ ios_base::sync_with_stdio(0); int t; cin >> t; while(t--){ int n; cin >> n; string s; cin >> s; int current_healthy_town_counter = 0; int infected_neighbours = 0; if(s[0] == '1') infected_neighbours = 1; vector<TownGroup*> town_groups; for(int i=0; i<n; i++){ if(s[i] == '0'){ ++current_healthy_town_counter; } else if(s[i] == '1' && current_healthy_town_counter > 0){ town_groups.push_back(new TownGroup(current_healthy_town_counter, infected_neighbours+1)); current_healthy_town_counter = 0; infected_neighbours = 1; } } if(current_healthy_town_counter > 0){ town_groups.push_back(new TownGroup(current_healthy_town_counter, infected_neighbours)); } sort(town_groups.begin(), town_groups.end(), townGroupPriority); int time = 0, result = 0; for(int i=0; i<town_groups.size(); i++){ TownGroup * current_town_group = town_groups[i]; result += max(0, current_town_group->calcValue(time)); time += current_town_group->infectedNeighbours; delete current_town_group; } cout << n-result << "\n"; } } |