P2440 木材加工 - 洛谷
這種題我們就是把答案枚舉出來,然后對答案進行二分,然后再進行判斷
比如我們這道題,我們枚舉切割的長度,然后由于切割長度越長切割段數越少 切割長度越短,切割段數越多的性質,我們可以二分切割的長度,然后判斷長度對應的段數是大于等于k還是小于k,段數大于等于k是符合條件的,
如果calc(x)是大于等于k的時候,我們讓left=mid
如果calc(x)小于k的時候,我們讓right = mid-1
廢話不多說,我們直接來實現一下代碼
#include <iostream>
using namespace std;
typedef long long LL;
int n,k;
const int N = 1e5+10;
LL a[N];
LL calc(int x)
{LL sum = 0;for(int i = 1;i<=n;i++){sum+=a[i]/x;}return sum;
}
int main()
{cin >> n >> k;for(int i = 1;i<=n;i++) cin >> a[i];LL left = 0,right = 1e8;while(left<right){LL mid = (left+right+1)/2;if(calc(mid) >= k) left = mid;else right = mid-1;}cout << left << endl; return 0;
}