OriginalGriff
Это твое домашнее задание, так что я не дам тебе никакого кода!
Но сначала: сделайте отступ в вашем коде - это делает его намного более читабельным, и что Менас его легче модифицировать.
Например, ваш код представлен следующим образом:
#include <iostream>
using namespace std;
int main()
{
int N,count=0;
int max=0;
cin>>N;
int a[N];
for(int i=1;i<=N;i++)
cin>>a[i];
for(int i=1;i<=N;i++)
{for(int j=1;j<=N;j++)
if(a[i]==a[j])
count++;
if(count>max)
max=count;
count=0;
}
cout<<N-max;
return 0;
}
Изрезанный:
#include <iostream>
using namespace std;
int main()
{
int N,count=0;
int max=0;
cin>>N;
int a[N];
for(int i=1;i<=N;i++)
cin>>a[i];
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
if(a[i]==a[j])
count++;
if(count>max)
max=count;
count=0;
}
cout<<N-max;
return 0;
}
Теперь вы можете гораздо легче увидеть, что делают циклы. Я бы также посоветовал вам, как новичку, всегда использовать фигурные скобки, даже если у вас есть только одна строка кода в блоке:
#include <iostream>
using namespace std;
int main()
{
int N,count=0;
int max=0;
cin>>N;
int a[N];
for(int i=1;i<=N;i++)
{
cin>>a[i];
}
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
if(a[i]==a[j])
{
count++;
}
}
if(count>max)
{
max=count;
}
count=0;
}
cout<<N-max;
return 0;
}
Затем, когда вы изменяете код, это намного легче сделать правильно.
Ваш код на самом деле не работает, потому что вы считаете один и тот же элемент несколько раз:
Вы считаете первые три как один, затем вы добавляете второй и третий, затем вы двигаетесь дальше в массиве и снова считаете вторые три, затем третий, затем вы двигаетесь дальше в массиве и снова считаете третьи три.
Способ, которым я бы это сделал, прост: отсортируйте массив до того, как вы его проверите, тогда бит "найти количество дубликатов" тривиален - все они находятся рядом друг с другом:
3 1 5 3 3 2 --> 1 2 3 3 3 5
Простой цикл с одним проходом через отсортированные данные даст вам максимальное количество дубликатов.