2015-06-17 2 views
-2

Это часть моего question.i много раз пыталась, но не смогла получить ответC++: Hackerank: Ошибка в принятии входа

Постановка задачи

Вы получите список N человек которые участвуют в финале ACM-ICPC World Finals. Каждый из них либо хорошо разбирается в теме, либо нет. Узнайте максимальное количество тем, которые может знать команда из 2 человек. А также узнать, сколько команд может знать, что максимальное количество тем.

Примечание. Предположим, что a, b и c являются тремя разными людьми, тогда (a, b) и (b, c) считаются двумя разными командами.

Входной формат

Первая строка содержит два целых числа, N и M, разделенные одним пробелом, где N представляет собой количество людей, и М представляет собой ряд вопросов. Далее следуют N строк. Каждая строка содержит двоичную строку длины M. Если j-й символ i-й строки равен 1, то i-й человек знает j-ю тему; в противном случае он не знает эту тему.

Ограничения

2≤N≤500 
1≤M≤500 

Формат вывода

На первой строке выведите максимальное количество вопросов 2-человек команды может знать. На второй строке напечатайте количество команд из 2 человек, которые могут знать максимальное количество тем.

Пример ввода

4 5 
10101 
11100 
11010 
00101 

Пример вывода

5 
2 

Объяснение

(1, 3) и (3, 4) знают все 5 тем. Таким образом, максимальные темы, которые команда из 2 человек знает, составляют 5, и только 2 команды могут это достичь.

это аа часть моего work.Any подсказки, как я могу получить этой работу

#include <cmath> 
#include <cstdio> 
#include <vector> 
#include <iostream> 
#include <algorithm> 
using namespace std; 

int main() { 
    int n, m, max = 0, max1 = 0, count = 0; 
    cin >> n >> m;         //for input of N and M 
    int a[n][m]; 

    for (int i = 0; i<n; i++)   //for input of N integers of digit size M 
    for (int j = 0; j<m; j + >> 
     cin >> a[i][j]; 

    for (int i = 0; i < n; i++) 
    { 
     for (int j = 0; j < n; j++) 
     { 
      max = 0; 
      for (int k = 0; k<m; k++) 
      { 
       if (a[i][k] == 1 || a[j][k] == 1) max++; 
       cout << k; 
       if (k = m - 1 && max>max1) max1 = max; 
       if (k == m - 1 && max == max1) count++;; 

      } 
     } 
    } 

    cout << max1 << endl << count; 
    return 0; 
} 

Я думаю, что способ взять мою входную логику wrong.could вы, пожалуйста, помогите мне out.I Я застрял в этом вопросе с 5 дней.
PLease только помогите мне в том, как я должен принимать ввод и как читать цифру целого.

+0

https://stackoverflow.com/questions/737240/cc-array-size-at-run-time-wo-dynamic-allocation-is-allowed – CoryKramer

+0

Вы не можете сделать это 'cin >> n >> m; ', то' int a [n] [m]; ', размер массива должен быть известен во время компиляции, а не время выполнения. – CoryKramer

+0

то как я должен вносить свой вклад в этот вопрос? –

ответ

0

У меня нет компилятора, так что там, вероятно, есть синтаксис или два, но логика проходит по бумаге.

Строит хранения:

std::cin >> n >> m; //for input of N and M 
std::vector<std::vector<bool>>list(n,std::vector<bool>(m, false)); 

загружает хранения:

char temp; 
for (int i = 0; i < n; i++) //for input of N integers of digit size M 
{ 
    for (int j = 0; j < m; j++) 
    { 
     std::cin >> temp; 
     if (temp == 1) 
     { 
      list[i][j] = true; 
     } 
    } 
} 

Запускает алгоритм

for (int a = 0; a < n; a++) 
{ 
    for (int b = a+1; b < n; b++) 
    { 
     int knowcount = 0; 
     for (int j = 0; j < m; j++) 
     { 
      if (list[a][j] | list[b][j]) 
      { 
       knowcount ++; 
      } 
     } 
     if (knowcount > max) 
     { 
      groupcount = 1; 
      max = know; 
     } 
     else if(knowcount == max) 
     { 
      groupcount ++; 
     } 
    } 
} 
0

Ваш метод ввода является неправильным. По вашему методу, вход должен быть дан следующим образом (с пробелами между отдельными номерами):

1 0 1 0 1 
1 1 1 0 0 
1 1 0 1 0 
0 0 1 0 1 

Только тогда имеет смысл создать матрицу. Но так как формат в вопросе не содержит пробела между числом в той же строке, таким образом, этот метод не сработает. Принимая во внимание тестовый пример, у вас может возникнуть соблазн сохранить числа «N» в одномерном целочисленном массиве, но имейте в виду, что ограничения («M» могут быть такими же большими, как 500 и int или даже беззначными длинными длинными данными тип не может хранить такое большое количество).

+0

Не думайте о 10101 как первый вход. Это поток. 'cin >> char' будет читать ровно один символ из этого потока, пропуская и отбрасывая все обычные пробельные символы. Повторный 'cin >> char' будет продолжать извлекать символы по одному. Wrap 'while (std :: cin >> temp) cout << temp; 'в маленькой программе quickie и посмотреть, что происходит, когда вы печатаете. – user4581301

+0

@ user4581301 Да, вы были правы. Я этого не знал. Но, как Хаммад принял участие, это неправильно, не так ли? – Shubham

+0

О да, это неправильно. Вся строка или столько же, сколько int может съесть, не приводя к ошибке перехода, будет считаться одним целым числом. – user4581301