題目
一些糖果 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;
}