分蛋糕
问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, …, an。小明想分给每个朋友至少重量为k的蛋糕。小明的朋友们已经排好队准备领蛋糕,对于每个朋友,小明总是先将自己手中编号最小的蛋糕分给他,当这个朋友所分得蛋糕的重量不到k时,再继续将剩下的蛋糕中编号最小的给他,直到小明的蛋糕分完或者这个朋友分到的蛋糕的总重量大于等于k。 输入格式 输入的第一行包含了两个整数n, k,意义如上所述。 输出格式 输出一个整数,表示有多少个朋友分到了蛋糕。 样例输入 6 9 样例输出 3 样例说明 第一个朋友分到了前3块蛋糕,第二个朋友分到了第4、5块蛋糕,第三个朋友分到了最后一块蛋糕。 评测用例规模与约定 对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 10000,1 ≤ ai ≤ 1000。
解题过程:最开始把题给看错了,我给当成了把重量最小的优先给,然后怎么写都是0分,下次一定要看清楚题目要求。整体思路将蛋糕重量存入数组,然后定义一个新数组用于每次蛋糕重量加和,判断当cake重量大于等于k的时候,就把cake赋值给数组b,要求是有几个人分到了蛋糕,就判断b中有多少元素大于0,然后输出。第一次练习给的50分,然后百思不得其解,算法过程很清晰啊,运行也完全没有问题啊,为啥是50分,然后。。。。我把数组大小定义从100改到10001,然后就100分了,真的是醉了; |
package ccf;
import java.util.*;
public class Cake {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int k=in.nextInt();
int[] a=new int[10001];
for(int i=0;i<n;i++) {
a[i]=in.nextInt();
}
int cake=0;
int j=0;
int[] b=new int[10001];
for(int i=0;i<n;i++) {
if(cake<k) {
cake+=a[i];
}
else if(cake>=k){
b[j]=cake;
j++;
cake=0;
i--;
}
if(i==(n-1)){
b[j]=cake;
}
}
int count=0;
for(int i=0;i<n;i++) {
if(b[i]>0) {
count++;
}
}System.out.println(count);
}
}
特别说明i--的作用,因为是在for循环里面,判断条件不满足的时候就直接进行下一循环了,而当前的a[i]没有使用,所以使i--;