试题 算法训练 kAc给糖果你吃
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
kAc有n堆糖果,每堆有A[i]个。
kAc说你只能拿m次糖果,聪明的你当然想要拿最多的糖果来吃啦啦啦~
//第二天,kAc问你还想吃糖果么?(嘿嘿嘿)说着眼角路出奇怪的微笑...
输入格式
第一行两个数字n和m,第二行有n个数字A[i]。
输出格式
输出一行表示最多能拿几个糖果。
样例输入
2 2
1 2
样例输出
3
数据规模和约定
0<n≤1000
其余数字都是不超过1,000,000,000的非负整数。
很简单的贪心问题,解如下:
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
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{ //拿糖果次数小于糖果堆数,冒泡排序后,将多的放前面m堆,再求和
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);
}
}