原题:
给出N根木棒,且长度均已知,现在希望通过切割来得到至少K段长度相等的木棒(长度必须是整数),问这些长度相等的木棒最长能有多长。
输入格式:
首先在第一行中给出木棒数N和需要得到相同长度的木棒K段。 接下来一行给出N个数据,表示每个木棒的长度。
输出格式:
输出木棒的在能满足切割K段时最长长度。
输入样例:
在这里给出一组输入。例如:
3 7
10 24 15
输出样例:
在这里给出相应的输出。例如:
6
代码:(二分法)
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, k, i, num;
cin >> n >> k;
int* a = new int[n];
for (i = 0; i < n; i++)
cin >> a[i];
//将a数组元素从小到大排列
sort(a, a + n);
int left = 0, right = a[n - 1], mid;
while (left < right)
{
num = 0;
mid = (left + right) / 2;
for (i = 0; i < n; i++)
num += a[i] / mid;
if (num >= k)
left = mid+1;
else
right = mid-1;
}
cout << left-1;
return 0;
}
代码:(暴力法)
#include<bits/stdc++.h>
using namespace std;
int n,k;
int find(int a[], int num)
{
int ans = 0;
for (int i = 1; i < 10000; ++i)
{
ans = 0;
for (int j = 0; j < n; ++j)
{
ans += a[j] / i;
}
if (ans < num)
{
return i;
}
}
return -1;
}
int main()
{
cin >> n >> k;
int* a = new int[n];
for (int i = 0; i < n; ++i)
{
cin >> a[i];
}
cout << find(a, k)-1;
return 0;
}