Неожиданный вывод для тестового примера

Проблема Codeforces 158B-http://codeforces.com/problemset/problem/158/B

Я получаю неожиданный вывод для тестового примера 5. Я думаю, что я должен получить 1 как вывод, но я его как 2. Пожалуйста, направьте меня. Журнал судьи:

Тест: № 5, время: 30 мс, память: 380 КБ, код выхода: 0, код выхода из проверки: 1, вердикт: WRONG_ANSWER
вход
2
2 1
Выход
2
Ответ
1
Журнал проверки
ожидается неправильный ответ 1, найдено 2

Мое решение:

#include<iostream>
using namespace std;
int n,a[100000],i,b,c,d,e,f,g,h;
int main()
{
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
}
b=0;
c=0;
d=0;
e=0;
for(i=0;i<n;i++)
{
if(a[i]==1) //To check for number of 1,2,3 and 4 membered groups.
b=b+1;
if(a[i]==2)
c=c+1;
if(a[i]==3)
d=d+1;
if(a[i]==4)
e=e+1;
}
f=e;
if(d>b) //More 3 member groups than 1.
{
f=f+d; //f=f+b+(g-b) 3 and 1 member groups combine.Remaining 3 i.e. (g-b) member groups will can't combine with 2 member groups.Hence,they take separate taxies.
g=-1;
}
if(b>=d) //More 1 member groups than 3.
{
f=f+d;
g=b-d; //g=remaining 1 member groups.
}
h=(2*c)%4; //Empty seats in last taxi.Possible values can be 0,1,2,3.
if(h==0)
f=f+(c/2);
else
f=f+((c+1)/2);

if(g!=-1)
{
g=g-h; //Remaining 1 member groups after combining with remaining seats in last 2 member taxi.
if((g%4)==0)
f=f+(g/4);
else
f=f+(g/4)+1;
}
cout<<f;
}

0

Решение

Если ваш вклад 2 2 1, затем b а также c будет как 1, делая f 0 и g 1 в первом наборе условных выражений. h будет (2 * 1) % 4 или 2, делая обновление для f (0 + 1 = 1). поскольку g это 1, g-h -1, что приведет к выполнению вами f=f+(g/4)+1 который f=1 + (-1/4)+1 который равен 1 + 0 + 1 = 2 в целочисленной математике.

Я думаю, что вы хотели проверить, если g-h>0 вместо g!=-1, но есть множество мест, где вы можете упростить свой код. Обратите внимание, что использование отладчика и пошаговое выполнение этого шага показали бы, что ваши проблемы гораздо быстрее, и были бы гораздо более полезными для повышения ваших навыков, чем обращение к SO.

Просто для тех, кто смотрит на этот вопрос, этот это довольно простой ответ на проблему.

1

Другие решения

  1. Сделайте это вручную и посмотрите, получите ли вы тот же ответ. Если вы получите тот же ответ вручную, что и вычисление, ваш алгоритм неверен. Если вы этого не сделаете, ваш код неверен.
  2. Распечатайте переменные из промежуточных вычислений, чтобы увидеть, являются ли они такими, какими, по вашему мнению, они должны быть.
  3. Убедитесь, что, если это имеет значение, перед каждым использованием вы переинициализируете свои переменные (включая массивы).

Другие советы:

  • Используйте оператор switch вместо нескольких операторов if-equal.
  • Назовите свои переменные. Это поможет вам отслеживать, глядя на ваш код.
  • Если у вас есть несколько переменных с одинаковым использованием, рассмотрите возможность использования массива. b, c, d, а также e все кажутся похожими.
1

По вопросам рекламы [email protected]