题意:给你一个数列,然后让你删掉某个数,让每一个数都可以与另外一个数相加,之和等于2的^d次方,问最少删掉的个数
解题思路:
先预处理出2的次幂,然后暴力枚举出每个数与每个2的次幂之差,去判断在map中是否有这样的差存在(注意相同的两个数,比如4 ,4 这个时候就可以特判一下,出现次数),若不存在那么就需要删除掉这个数。
解题思路:
1.先弄出一个2的N次方的数组
2.hashmap记录数字是否出现,以及是否重复
3.遍历原数组,每个数字与2的N次方数组作差,用hashmap查看差值是否存在:
AC代码:
import javax.print.DocFlavor;
import javax.swing.*;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.nio.file.attribute.AclEntryFlag;
import java.security.AlgorithmConstraints;
import java.sql.Struct;
import java.text.CollationElementIterator;
import java.text.DateFormatSymbols;
import java.util.*;
import java.util.stream.Collectors;public class Main
{static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));static int N = (int)12e4 + 10;static math_myself math_me = new math_myself();static int a[] = new int[N];static long d[] = new long[32];static Map map = new HashMap<>(); // 存每个数操作次数// 2次幂的预处理static void init_2_pow(){d[0] = 1;for(int i = 1 ; i <= 31 ; i ++) d[i] = d[i - 1]*2;}public static void main(String[] args ) throws IOException{init_2_pow();int cnt = 0;int n = rd.nextInt();for (int i = 0; i < n; i++){a[i] = rd.nextInt();if (map.get(a[i]) == null) map.put(a[i], 1);else map.put(a[i], map.getOrDefault(a[i], 0) + 1);}int j;// 枚举每一个a[i]for (int i = 0; i < n; i++){// 枚举每一个指数for (j = 0; j <= 31; j++){int k = (int) (d[j] - a[i]); // 2次幂与a[i]的差值if(k <= 0) continue; // 2次幂太小,不足以构成两个数的和if(k == a[i] && map.get(k) >= 2) break; // 两个数是一样的,比满足两数之和是2次幂if(k != a[i] && map.get(k) != null) break; // 每个数不一样,a[j]也存在于哈希表中,即原数组}if(j == 32) cnt ++;}pw.println(cnt);pw.flush();}}class rd
{static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));static StringTokenizer tokenizer = new StringTokenizer("");static String nextLine() throws IOException { return reader.readLine(); }static String next() throws IOException{while (!tokenizer.hasMoreTokens()) tokenizer = new StringTokenizer(reader.readLine());return tokenizer.nextToken();}static int nextInt() throws IOException { return Integer.parseInt(next()); }static double nextDouble() throws IOException { return Double.parseDouble(next()); }static long nextLong() throws IOException { return Long.parseLong(next());}static BigInteger nextBigInteger() throws IOException{BigInteger d = new BigInteger(rd.nextLine());return d;}
}class PII
{int x,y;public PII(int x ,int y){this.x = x;this.y = y;}
}class math_myself
{int gcd(int a,int b){if(b == 0) return a;else return gcd(b,a % b);}int lcm(int a,int b){return a * b / gcd(a, b);}// 求n的所有约数List get_factor(int n){List a = new ArrayList<>();for(long i = 1; i <= Math.sqrt(n) ; i ++){if(n % i == 0){a.add(i);if(i != n / i) a.add(n / i); // // 避免一下的情况:x = 16时,i = 4 ,x / i = 4的情况,这样会加入两种情况 ^-^复杂度能减少多少是多少}}// 相同因子去重,这个方法,完美a = a.stream().distinct().collect(Collectors.toList());// 对因子排序(升序)Collections.sort(a);return a;}// 判断是否是质数boolean check_isPrime(int n){if(n < 2) return false;for(int i = 2 ; i <= n / i; i ++) if (n % i == 0) return false;return true;}
}