题目
一些糖果 candies,分给排好队的 n = num_people 个小朋友。给第一个小朋友 1 颗糖果,直到给最后一个小朋友 n颗糖果。然后,我们再回到队伍的起点,给第一个小朋友 n + 1 颗糖果,依此类推,直到给最后一个小朋友 2 * n 颗糖果,直到糖果分完。
题目来源:https://leetcode-cn.com/problems/distribute-candies-to-people/
解题思路
1.判读小朋友的个数,若小于或等于0,不发糖果,返回null
2.若不为空,获取给第一个小朋友糖果的次数,
3.由于每个小朋友每次获得的糖果数之间满足等差队列
4.获得在最后一次到达第一个小朋友前剩余的糖果
5.获得每个小朋友获得的糖果数
解答
测试代码
import java.util.Scanner;
public class tanguo {
tanguo t=new tanguo();
Scanner s=new Scanner(System.in);
System.out.println("请输入糖果数:");
int candies=s.nextInt();
System.out.println("请输入人数:");
int num_people=s.nextInt();
t.distributeCandies(candies,num_people);
}
主要代码
public int[] distributeCandies(int candies, int num_people) {
//若第一轮每个小朋友都分到糖果,则需要糖果为2*(n+1)/2
//第一轮剩余糖果数为candies-()2*(n+1)/2)
//需要的num轮为candies-(2*(n+1)/2)*(num)+(num-1)*(num_people*num_people))
//设置需要num轮,需要第n个小朋友获得的糖果数为n+num_people*(num-1)
if(num_people<=0){
return null;
}
int a[]=new int[num_people];
int num=numCi(candies,num_people);
//在第n-1轮后剩余的糖数位 candies-(2*(num_people+1))/2)*(num-1)+Math.pow(num_people,num-2);
int x= (int) (candies-((num-1)*(num_people))*(((num-1)*(num_people))+1)/2);
//第一个孩子在n轮最多可分糖数为num*1+num_people*(num-1)
// int b=0;
int c=0;
for(int j=0;j<num_people;j++){
int i=j+1;
c=i+(num_people*(num-1));
if(x>0)
{
if(x-c>0){
int b=(num-1)*((num-2));
//int d=b*num_people;
a[j]=(((num-1)*i)+((b*num_people)/2)+c);
x=x-c;
}
else{
int b=(num-1)*((num-2));
// int d=b*num_people;
a[j]=(((num-1)*i)+((b*num_people)/2)+x);
x=0;
}
}
else{
int b=(num-1)*((num-2));
a[j]=(((num-1)*i)+((b*num_people)/2));
}
System.out.println(a[j]);
}
return a;
}
public int numCi(int candies, int num_people )//7,4
{ int num=0;
int lessCandies=0;//糖数
while(lessCandies<candies)
{
num++;
lessCandies= (int) (((num)*(num_people))*(((num)*(num_people))+1)/2);
}
// System.out.println(num);
return num;
}