这是我的问题的一部分。我尝试了很多次,但无法得到答案
问题陈述
您将获得参加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天开始坚持这个问题。
只能帮助我如何获取输入以及如何读取整数位。
答案 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 ++;
}
}
}
答案 1 :(得分: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或甚至无符号long long int数据类型不能存储这么大的数字。)