Dzięki przespaniu się z problemem i dyskusji z użytkownikiem Sinoviesta, udało mi się znaleźć jeden z błędów w moim rozwiązaniu. Nie rozważałem przypadku, w którym liczba wystąpień nie jest większa od a1 lub b1, a jest większa od a2 lub b2. Tak wygląda kod po poprawkach:
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int main() {
int n, k, zgodne{0};
pair<int, int> a1{0, 0}, a2{0, 0}, b1{0, 0}, b2{0, 0};
scanf("%d", &n);
int ** kolory = new int * [2];
kolory[0] = new int[n];
kolory[1] = new int[n];
for(int i=0; i<n; i++)
kolory[0][i]=kolory[1][i]=0;
for(int i=0; i<n; i++)
{
scanf("%d", &k);
kolory[i%2][k-1]++;
}
for(int i=0; i<n; i++)
{
if(kolory[0][i]>=a1.first)
{
a2=a1;
a1.first=kolory[0][i];
a1.second=i;
}
else if(kolory[0][i]>a2.first)
{
a2.first=kolory[0][i];
a2.second=i;
}
if(kolory[1][i]>=b1.first)
{
b2=b1;
b1.first=kolory[1][i];
b1.second=i;
}
else if(kolory[1][i]>b2.first)
{
b2.first=kolory[1][i];
b2.second=i;
}
}
if(a1.second!=b1.second)
zgodne=max(zgodne, a1.first+b1.first);
if(a2.second!=b1.second)
zgodne=max(zgodne, a2.first+b1.first);
if(a1.second!=b2.second)
zgodne=max(zgodne, a1.first+b2.first);
printf("%d", n-zgodne);
delete [] kolory[0];
delete [] kolory[1];
delete [] kolory;
return 0;
}
Mój problem nie został jednak do końca rozwiązany, gdyż jeden z testów zwraca błędny wynik.
Proszę o pomoc w znalezieniu i zrozumieniu błędu.
Dziękuję za pomoc użytkownikowi Sinoviesta.
EDIT
Udało mi się znaleźć błąd. Możliwy jest przypadek, w którym maksymalną liczbę razy występują kolory 0. Możliwa jest również sytuacja, w której nie aktualizujemy wartości a2 lub b2. Z domyślną wartością koloru równą 0, program nie działa dla takich przypadków. Pomogła inicjalizacja zmiennych a1, a2, b1, b2 z wartością -1.
Oto działający kod:
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int main() {
int n, k, zgodne{0};
pair<int, int> a1{-1, -1}, a2{-1, -1}, b1{-1, -1}, b2{-1, -1};
scanf("%d", &n);
int ** kolory = new int * [2];
kolory[0] = new int[n];
kolory[1] = new int[n];
for(int i=0; i<n; i++)
kolory[0][i]=kolory[1][i]=0;
for(int i=0; i<n; i++)
{
scanf("%d", &k);
kolory[i%2][k-1]++;
}
for(int i=0; i<n; i++)
{
if(kolory[0][i]>=a1.first)
{
a2=a1;
a1.first=kolory[0][i];
a1.second=i;
}
else if(kolory[0][i]>a2.first)
{
a2.first=kolory[0][i];
a2.second=i;
}
if(kolory[1][i]>=b1.first)
{
b2=b1;
b1.first=kolory[1][i];
b1.second=i;
}
else if(kolory[1][i]>b2.first)
{
b2.first=kolory[1][i];
b2.second=i;
}
}
if(a1.second!=b1.second)
zgodne=max(zgodne, a1.first+b1.first);
if(a2.second!=b1.second)
zgodne=max(zgodne, a2.first+b1.first);
if(a1.second!=b2.second)
zgodne=max(zgodne, a1.first+b2.first);
printf("%d", n-zgodne);
delete [] kolory[0];
delete [] kolory[1];
delete [] kolory;
return 0;
}
Mam wzorcówke. Dziękuję za pomoc