1. 程式人生 > 其它 >Problem:剪繩子

Problem:剪繩子

技術標籤:演算法二分法c++

題目描述

有N根繩子,第i根繩子長度為Li,現在需要M根等長的繩子,你可以對N根繩子進行任意裁剪(不能拼接),請你幫忙計算出這M根繩子最長的長度是多少。

輸入格式

第一行包含2個正整數N、M,表示原始繩子的數量和需求繩子的數量。

第二行包含N個整數,其中第 i 個整數Li表示第 i 根繩子的長度。

輸出格式

輸出一個數字,表示裁剪後最長的長度,保留兩位小數。

資料範圍

在這裡插入圖片描述

輸入樣例

在這裡插入圖片描述

輸出樣例

在這裡插入圖片描述

樣例解釋

第一根和第三根分別裁剪出一根2.50長度的繩子,第二根剪成2根2.50長度的繩子,剛好4根。

思路

二分

程式程式碼

#include <iostream>
#include <cstdio> using namespace std; const int N = 100010; int n, m; int a[N]; bool judge(double x) { int cnt = 0; for(int i = 0; i < n; ++ i) cnt += a[i] / x; return cnt >= m; } int main() { cin >> n >> m; for(int i = 0; i < n; ++ i) cin >>
a[i]; //輸入 double l = 0, r = 1e9; while(r -l > 1e-4) //設定臨界值 { double mid = (l + r) / 2; if(judge(mid)) l = mid; else r = mid; } printf("%.2f\n",l); return 0; }
  • 如有問題,歡迎交流