在C語言中,將最大數量的巧克力平均分配給k個學生


給定一個數組形式的連續盒子中巧克力的數量和一個數字k,該數字代表將這些巧克力分配給的學生人數。這裡的任務是選擇連續的盒子,使得其中巧克力的總和可以平均分配給k個學生。我們還必須確保巧克力的數量最大。

為此,我們將從左到右遍歷陣列,開始新增巧克力的數量,並將總和除以k。如果它被完全除盡,餘數等於0,則將此總和儲存在一個變數中。隨著我們的進一步移動,我們將重複此過程,直到獲得最大的此類總和。問題是找到最大和子陣列,該子陣列可以被k整除。

輸入 

Choco[]={ 1,2,4,5,2,8,3,5 } k=3

輸出 − 平均分配給k個學生的最大巧克力數量 − 5

解釋 − 最大和子陣列是{5,2,8}。巧克力的總和是15。平均分配,所有3個學生獲得的最大巧克力數量是5。

注意 − 箱子是連續的,索引是{3,4,5}

輸入 

Choco[] = { 2,3,7,5,4,8,2,6 } k=5

輸出 − 平均分配給k個學生的最大巧克力數量 − 7

解釋 − 最大和子陣列是{3,7,5,4,8,2,6}。巧克力的總和是35。

平均分配,所有5個學生獲得的最大巧克力數量是7。

下面程式中使用的演算法如下

  • 我們使用一個整數陣列arr[],其中包含連續容器中巧克力的數量。

  • 元素個數'n'表示盒子的數量。

  • 將學生人數'k'作為輸入。

  • 函式maxChocolate(int arr[], int n, int k)接受三個引數:陣列、其大小和學生人數k。

  • 我們將使用for迴圈從開頭遍歷arr[]。

  • 使用兩個變數sum和maxSum。Sum儲存子陣列連續元素的和。

  • maxSum用於儲存到目前為止找到的最大和。

  • 在巢狀的for迴圈中,繼續新增元素並檢查sum%k是否給出餘數0。

    如果此sum > maxSum,則更新maxSum。

  • 最後,maxSum將包含可以平均分配給k個學生的最大巧克力數量。

  • 返回結果為maxSum/k,這是每個學生獲得的巧克力數量。

示例

 線上演示

#include <stdio.h>
// to find the maximum number
// of chocolates to be distributed equally among
// k students
int maxChocolates(int arr[], int n, int k){
   int sum;
   int maxSum = 0;
   for(int i=0;i<n;i++){
      sum=0;
      for(int j=i;j<n;j++){
         sum+=arr[j];
         if(sum%k==0 && sum>maxSum)
            maxSum=sum;
      }
   }
   // distributed equally among 'k' students
   return (maxSum / k);
}
int main(){
   int arr[] = { 2, 7, 6, 1, 4, 5 ,5, 3 };
   int n =8;
   int k =3;
   printf("Maximum number of chocolates to be distributed equally among k students: %d   ",maxChocolates(arr, n, k));
   return 0;
}

輸出

如果我們執行上面的程式碼,它將生成以下輸出:

Maximum number of chocolates to be distributed equally among k students − 11

更新於:2020年8月14日

1K+ 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.