分割繩子(二分)

2021-09-19 23:50:08 字數 1521 閱讀 6277

現在有n(1 <= n <= 1000)條繩子,

他們的長度分別為l1,l2,……,ln(1 <= li <= 10000),如果從他們中切割出k(1 <= k <= 1000)條長度相同的繩子,

這k條繩子每條最長能多長?

收起

共有兩行,第一行包含兩個正整數n和k,用乙個空格分割;第二行包含n個數,一次表示n條繩子的長度,兩數間用乙個空格分隔,每條繩子的長度的小數不超過兩位。
僅包含乙個數,表示所得k條繩子的最大長度。答案四捨五入保留小數點後兩位

原題的樣例似乎出了個問題,樣例的精確的答案是2.005,四捨五入的話應該是2.01才對。

4 11

8.02 7.43 4.57 5.39

2.01
這個就是二分的思想,關鍵是精度,保留的時候好像忽視3位小數的大小,所以要自己設計實現。題目問每條最長能多長?每次偏右查詢

#include#include#include#include#include#include #include #include #include#include#include #include#include #include #include #define  inf  0x3f3f3f3f

#define exp 0.00001

#define mmt(a,b) memset(a,b,sizeof(a))

typedef long long ll;

const ll max=1000000;

using namespace std;

double n,k,num=0,sum=0;

double ans[10010];

bool judge(double a );

int main()

double high=sum/k;

double low=0.0;

double mid;

while(fabs(high-low)>exp)

mid=mid*1000+0.5;//使得精度準確些

mid/=1000;

printf("%.2lf",mid);

}bool judge(double a )

if(count>=k) return 1;

return 0;

}

下邊的比我的漂亮

code:

#include using namespace std;

int n, k, a[1000];

int main()

int l = 0, r = 1e7 + 1;

while (l < r - 1)

if (s < k) else

}printf("%.2f\n", (l + 5) / 10 / 100.0);

return 0;

}核心在於把這個問題轉化為整數,這個事情就好做多了。

分割繩子(二分)

時間限制 1 sec 記憶體限制 128 mb 題目描述 現有n條繩子,它們的長度分別為l1,l2,ln,如果從它們中切割出k條長度相同的繩子,這k條繩子每條最長能有多長?輸入共有兩行,第一行包含兩個正整數n和k,用乙個空格分隔 第二行包含n個數,依次表示n條繩子的長度,兩數間用乙個空格分隔。每條繩...

繩子切割 二分查詢

題目描述 有n條繩子,它們的長度為li li 1000 如果從它們中切割出k條長度相同的繩子的話,這條繩子每條最長能有多長?答案保留到小數點後2位。輸入輸入包含兩行,第一行有兩個整數n和k,n代表n條繩子,k代表切割出的長度。4 11 8 02 7.43 4.57 5.39 輸出輸出能切割出最長的長...

割繩子問題(二分)

題目描述 有 n 條繩子,它們的長度分別為 l ili 如果從它們中切割出 k 條長度相同的繩子,這 kk 條繩子每條最長能有多長?答案保留到小數點後 2 位 直接捨掉 2 位後的小數 輸入格式 第一行兩個整數 n 和 k,接下來 n 行,描述了每條繩子的長度 l ili 輸出格式 切割後每條繩子的...