算法练习
今天练习了两道蓝桥杯的算法题目
1、kAc给你糖果吃
问题描述
kAc有n堆糖果,每堆有A[i]个。
kAc说你只能拿m次糖果,聪明的你当然想要拿最多的糖果来吃啦啦啦~
//第二天,kAc问你还想吃糖果么?(嘿嘿嘿)说着眼角路出奇怪的微笑...
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取模的余数。
给定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); } }