SHOW:
|
|
- or go back to the newest paste.
| 1 | // Author : Saurav Kalsoor | |
| 2 | - | // Duplicate Bogies - JAVA |
| 2 | + | // Special Sum - JAVA |
| 3 | ||
| 4 | ||
| 5 | import java.util.*; | |
| 6 | ||
| 7 | public class Test {
| |
| 8 | ||
| 9 | static Scanner sc = new Scanner(System.in); | |
| 10 | ||
| 11 | public static void main(String[] args) {
| |
| 12 | int n = sc.nextInt(); | |
| 13 | System.out.println(specialSum(n)); | |
| 14 | - | ArrayList<Integer> arr = new ArrayList<>(); |
| 14 | + | |
| 15 | - | for(int i=0; i < n ;i++){
|
| 15 | + | |
| 16 | - | arr.add(sc.nextInt()); |
| 16 | + | public static int specialSum(int n){
|
| 17 | ArrayList<Integer> fact = new ArrayList<>(); | |
| 18 | - | System.out.println(duplicateBogies(n, arr)); |
| 18 | + | TreeMap<Integer, Integer> sums = new TreeMap<>(); |
| 19 | ||
| 20 | int i = 2, x = 1; | |
| 21 | - | public static int duplicateBogies(int n, ArrayList<Integer> arr){
|
| 21 | + | int maxLimit = 100000000; |
| 22 | - | HashSet<Integer> st = new HashSet<>(); |
| 22 | + | while(x < maxLimit){
|
| 23 | - | int res = n; |
| 23 | + | fact.add(x); |
| 24 | - | for(int x : arr){
|
| 24 | + | x *= i; |
| 25 | - | if(st.contains(x)){
|
| 25 | + | i++; |
| 26 | - | res = (n - st.size()); |
| 26 | + | |
| 27 | - | break; |
| 27 | + | |
| 28 | int limit = (int)Math.pow(2, 11); | |
| 29 | - | st.add(x); |
| 29 | + | |
| 30 | for(i = 1; i < limit; i++){
| |
| 31 | int sum = 0; | |
| 32 | - | Collections.reverse(arr); |
| 32 | + | for(int j = 0; j < 11; j++){
|
| 33 | - | st.clear(); |
| 33 | + | if((i & (1 << j)) > 0){
|
| 34 | - | |
| 34 | + | sum += fact.get(j); |
| 35 | - | for(int x : arr){
|
| 35 | + | } |
| 36 | - | if(st.contains(x)){
|
| 36 | + | |
| 37 | - | res = Math.min(res, (n - st.size())); |
| 37 | + | sums.put(sum, Math.min(bitCount(i), sums.containsKey(sum) ? sums.get(sum) : limit)); |
| 38 | - | break; |
| 38 | + | |
| 39 | ||
| 40 | - | st.add(x); |
| 40 | + | int res = bitCount(n); |
| 41 | for(Map.Entry<Integer, Integer> sum : sums.entrySet()){
| |
| 42 | if(sum.getKey() > n) break; | |
| 43 | - | if(res == n) res = 0; |
| 43 | + | |
| 44 | res = Math.min(res, bitCount(n - sum.getKey()) + sum.getValue()); | |
| 45 | } | |
| 46 | return res; | |
| 47 | } | |
| 48 | ||
| 49 | public static int bitCount(int n){
| |
| 50 | int res = 0; | |
| 51 | while(n > 0){
| |
| 52 | res += n%2; | |
| 53 | n /= 2; | |
| 54 | } | |
| 55 | return res; | |
| 56 | } | |
| 57 | } | |
| 58 |