【发布时间】:2019-03-01 18:36:14
【问题描述】:
一个班级有n 个学生。很快,将有一个校际科学测验,其中将有 4 个科目的问题,为简单起见,将它们称为 1、2、3 和 4。一个团队应该有 2 个学生。任何学生在特定科目上的好坏都是一样的。
我们有 n 行作为输入,每行有 4 个条目。如果i-th 列等于1,则学生擅长i-th 科目。我应该找出学校可以派出团队的总数,以便两个学生在一起知道所有4个科目。
例如,
S1: 1 1 1 1
S2: 1 1 0 1
S3: 1 0 1 1
S4: 0 0 1 1
S5: 0 0 0 0
学生 1 可以和任何学生一起去,因为所有科目都是他的强项。 => 4
学生 2 可以选择 S3 和 S4,因为 S2 在科目 1,2 和 4 中表现良好,而 S3 和 S4 在科目 3 中表现良好。=> 2(注意 (S1,S2) 已计入)
S3 会选择擅长科目 2 的人=> 无
S4:同样,没有。
因此,ans=4+2=6
我的解决方案:-
ans=0;
//arr is the array containing subject-wise "strength" of students
for(int i=0;i<n;i++){
ArrayList<Integer> a=new ArrayList<>();
for(int j=0;j<4;j++)
if(arr[i][j]==0)
a.add(j);
if(a.size()==0)
ans+=n-i-1;
else
for(int j=i+1;j<n;j++){
bool=false;
for(int k=0;k<a.size();k++){
if(arr[j][a.get(k)]==0)
break;
bool=true;
}
if(bool)
ans++;
}
}
System.out.println(ans);
现在我知道我的解决方案是正确的,但它的时间复杂度是 O(n^2),我正在寻找更好的解决方案。谢谢!
【问题讨论】:
-
@vivek -- 这不起作用; S2 需要有人在 2 的位置有
1。例如,值为 4 的人不会组成一个可行的团队。 -
@NicoSchertler:这个结论不成立。有些问题您可以计算解决方案的数量而无需描述这些解决方案。
-
@user11067275 不要循环访问学生。循环一个大小为 16 (0-15) 的数组,该数组将计算每个小数出现的次数。现在,对于每个学生,您只需遍历该数组并检查需要哪些位以及该数字是否设置了位。如果是,请将其添加到最终答案中
-
@vivek_23 是的!这是完美的。直接减少到
O(n)。非常感谢! -
对不起;我只是在写答案时阅读了进来的 cmets。看来@vivek_23 和我有同样的方法。