【问题标题】:c++:Hackerank:Error in taking inputc++:Hackerrank:输入错误
【发布时间】:2015-06-17 19:21:05
【问题描述】:

这是我的问题的一部分。我尝试了很多次但无法得到答案

问题陈述

您将获得一份参加 ACM-ICPC 世界总决赛的 N 人的名单。他们每个人要么精通某个主题,要么不精通。找出 2 人团队可以知道的最大主题数。并找出有多少团队可以知道最大数量的主题。

注意假设 a、b、c 是三个不同的人,那么 (a,b) 和 (b,c) 算作两个不同的团队。

输入格式

第一行包含两个整数,N 和 M,用一个空格分隔,其中 N 代表人数,M 代表主题数。接下来是 N 行。 每行包含一个长度为 M 的二进制字符串。如果第 i 行的第 j 个字符为 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 个团队可以做到这一点。

这是我工作的一部分。任何线索我怎样才能让它工作

#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;
}

我认为输入逻辑的方式是错误的。请你帮帮我。我从 5 天开始就被这个问题困住了。
请仅帮助我了解我应该如何输入以及如何读取整数的数字。

【问题讨论】:

  • 你不能这样做cin&gt;&gt;n&gt;&gt;m;,然后int a[n][m];,数组大小必须在编译时知道,而不是在运行时。
  • 那我该如何回答这个问题呢?
  • 你可以发std::vector&lt;std::vector&lt;int&gt;&gt;
  • 但是先生,我将如何具体读取整数的数字以及在编译时对其大小进行标定的数组大小问题在 c99 中有效

标签: c++ c99


【解决方案1】:

我没有编译器,所以里面可能有一两个语法笨蛋,但逻辑在纸上是贯穿始终的。

构建存储:

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 ++;
        }
    }
}

【讨论】:

    【解决方案2】:

    你的输入方法是错误的。根据您的方法,输入必须像这样给出(各个数字之间有空格):

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

    只有这样创建矩阵才有意义。但是由于问题中的格式在同一行中的数字之间不包含任何空格,因此该方法将失败。考虑到测试用例,您可能想将“N”个数字存储在一维整数数组中,但请记住约束(“M”可以大到 500 和 int 甚至 unsigned long long int 数据type 不能存储这么大的数字)。

    【讨论】:

    • 不要将 10101 视为第一个输入。它是一条溪流。 cin &gt;&gt;char 将从该流中仅读取一个字符,跳过并丢弃所有常见的空白字符。重复cin &gt;&gt; char 将继续一次提取一个字符。将while (std::cin &gt;&gt; temp) cout &lt;&lt;temp; 包裹在一个小程序中,观察你输入时会发生什么。
    • @user4581301 是的,你是对的。我不知道这个。但是,哈马德接受意见的方式是错误的,不是吗?
    • 哦,是的,这是错误的。整行,或 int 在不导致转换失败的情况下可以吃多少,将作为一个整数读入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2022-09-29
    • 2021-05-16
    • 2011-04-13
    • 2016-04-16
    • 2018-06-06
    相关资源
    最近更新 更多