import java.util.Scanner;
class Special_Pairs{
private static Scanner scan;
public static void main(String [] args) {
byte t;
int n;
scan = new Scanner(System.in);
t=scan.nextByte();
int[] a=new int[100000];
while(t>0)
{
int i,j,count=0;
n=scan.nextInt();
for(i=0;i<n;i++)
{
a[i]=scan.nextInt();
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(((a[i]&a[j])==0)||((a[j]&a[i])==0))
{
count++;
}
}
}
t--;
System.out.println(count);
}
}
}
帮助我降低此计划的时间复杂度
您已获得大小为N的整数数组A.您必须报告有序对(i,j)
的数量,以便A[i] & A[j]=0
。
此处&
表示BITWISE AND
(i,j)
和(j,i)
被视为不同。
输入:第一行包含T-Number测试用例。每个测试的第一行包含N.下一行包含N个整数 - 第i个整数A [i]。
输出:为每个测试用例输出此类对的数量。
约束:T≤10; N≤100000; A [i]≤1000000
样本输入(明文链接)
1
5
41 47 34 40 29
样本输出(明文链接)
2
说明:这些是必需的对(3 5)
(5 3)
答案 0 :(得分:2)
我建议三个优化。我也修改了代码。
current+1
开始。所以不会比较你已经比较过的元素。(i,j)
和(j,i)
。如果一个为零,则其他将始终为零。n
。import java.util.Scanner;
public class Pairs {
public static void main(String [] args) {
Scanner scan = new Scanner(System.in);
int t = scan.nextInt();
while(t > 0) {
t--;
int count = 0;
int n = scan.nextInt();
int a[] = new int[n];
for(int i = 0; i<n; i++) {
a[i]=scan.nextInt();
}
for(int i = 0; i<n-1; i++) {
for(int j = i+1; j<n; j++) {
if((a[i] & a[j])==0)
{
count += 2;
}
}
}
System.out.println(count);
}
}
}
答案 1 :(得分:0)
如果您正在参加编程竞赛(如ICPC或类似的竞赛),也许您不应该使用Scanner
。从键盘读取速度太慢了。我已经参加了ICPC比赛,但我过去常常使用C ++。也许您应该尝试BufferedReader
而不是Scanner
。