算法练习

今天练习了两道蓝桥杯的算法题目

1、kAc给你糖果吃

问题描述
  kAc有n堆糖果,每堆有A[i]个。
  kAc说你只能拿m次糖果,聪明的你当然想要拿最多的糖果来吃啦啦啦~
  //第二天,kAc问你还想吃糖果么?(嘿嘿嘿)说着眼角路出奇怪的微笑...
思路:首先读懂这个问题,你输入n堆糖果,只能拿m次;在第二行输入每一堆糖果的数量,而我们想要拿到最多的糖果。定义一个集合,将糖果数目存入集合当中,进行降序排序,在取糖果的时候进行限制
package algorithm;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;

//kAc给糖果你吃
public class lianxi07 {
//    public static void main(String[] args) {
//        Scanner sc = new Scanner(System.in);
//        int n = sc.nextInt();
//        int m = sc.nextInt();
//        BigInteger[] A = new BigInteger[n];
//        BigInteger sum = BigInteger.valueOf(0);//总的糖果数
//        
//        for(int i=0;i<A.length;i++) {//输入各堆糖果数
//            A[i]=sc.nextBigInteger();
//        }
//        
//        //拿糖果
//        if(m>n) {//堆数小于拿的次数
//            for(int i=0;i<n;i++) {
//                sum = sum.add(A[i]);
//            }
//        }
//        else //堆数大于拿的次数
//        {
//            BigInteger temp;
//            for(int i=0;i<n-1;i++) {
//                for(int j=i+1;j<n;j++) {
//                    if(A[i].compareTo(A[j])==-1) {//冒泡排序
//                        temp=A[i];
//                        A[i]=A[j];
//                        A[j]=temp;
//                    }
//                }
//            }
//            for(int i=0;i<m;i++) {
//                sum =sum.add(A[i]);
//            }
//        }
//        System.out.println(sum);
//    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        ArrayList<Long> A = new ArrayList<Long>();

        for (int i = 0; i < n; i++) {
            Long temp = sc.nextLong();
            A.add(temp);
        }

        // 降序排序
        A.sort(Comparator.reverseOrder());

        Long sum = (long) 0;
        for (int i = 0; i < m; i++) {
            sum += A.get(i);
        }
        System.out.println(sum);
    }
}

这里面有两种方法,我更喜欢第二种,通过集合来计算。

2、数的潜能

问题描述
  将一个数N分为多个正整数之和,即N=a1+a2+a3+…+ak,定义M=a1*a2*a3*…*ak为N的潜能。
  给定N,求它的潜能M。
  由于M可能过大,只需求M对5218取模的余数。
思路:根据题目给的例子,10=2+2+3+3;想要取得最大潜能,尽可能地与9取得联系。
package algorithm;

import java.util.Scanner;

//数的潜能
public class lianxi08 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Long n = sc.nextLong();
        Long a = (long) 0;
        int b = 0;
        int[] x = new int[100];//存储模值
        long[] z = new long[100];//存储位置
        // a 3的数量,b 2的数量
        if (n % 3 == 1) {
            a = (n / 3) - 1;
            b = 2;
        } else if (n % 3 == 2) {
            a = n / 3;
            b = 1;
        } else {
            a = n / 3;
        }
        long c = 1;
        int yu = 3 % 5218;
        int k = 0;
        x[0] = yu;
        z[0] = c;
        while (a >= 2 * c) {
            yu = (yu * yu) % 5218;
            x[++k] = yu;
            c *= 2;
            z[k] = c;
        }
        long d = a - c;
        for (int i = k - 1; i >= 0; i--) {
            if (d > z[i]) {
                yu = (yu * x[i]) % 5218;
                d = d - z[i];
            }
        }
        yu = (int) ((yu * Math.pow(3, d) * Math.pow(2, b)) % 5218);
        System.out.println(yu);
    }
}

 

posted on 2022-03-21 21:37  跨越&尘世  阅读(126)  评论(0编辑  收藏  举报