做题收获
1.数学从条件推出结果,一步步求结果。但是计算机因为其特点,可以从结果逆推
- 一开始我直接从条件推,用双指针直接比对一组组的数据,得出和相同的可能,但是时间复杂度过高,因此error
- 然后从结果逆推枚举,从题目中可以得到和的范围:<101,然后输入的时候把数据作为下标录入进去,不断凑组合,比较出现的次数。比如:n是5,max<11,从0-11不断枚举,sum=3时,min(a(1),a(2))
package _9yue4; import java.util.Scanner; public class A2 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int t=sc.nextInt(); while(t-->0) { int n=sc.nextInt(); int arr[]=new int [101];//这里存放权重数字 for (int i = 0; i < n; i++) { arr[sc.nextInt()]++;//作为下标统计人数 } int max=-1; for (int i = 2; i <= 2*n; i++) {//权重1-n,所以和2-2*n int sum=0; for (int j = 1; j <i; j++) { sum+=Math.min(arr[j], arr[i-j]); //找出和相同的情况下的 不同组合可能数 } max=max>sum?max:sum; } System.out.println(max/2);//因为一组数字成对出现,所以除以2, //此外,sum=6 (3,3)这种情况因为是不进位除法可以直接排除掉了 } } }