问题分析:输入输出 单段长度范围 总段数求和 木棒个数数组存储
思路分析:二分法解决 num>=K(至少K段,满足此条件的最后一个答案L,等价于num<K的第一个答案L)
代码如下:
#include<cstdio>
#include<algorithm>
using namespace std;
const int stickNum = 3;//三个常量数
int cut(int sticks[4], int k)// sticks存储每根筷子大小; 最大长度是 K ;
{
int sum = 0;
for(int i = 0; i < stickNum; i++)
{
sum += sticks[i] / k;//累计总长度
//printf("%d ", sum);
}
//printf("\n");
return sum;
}
int cmp(int a, int b)//比较函数
{
return a > b;
}
int main()//主函数
{
int sticks[stickNum];
int n, K = 7;//题目要求 假设看K为7 即7段,找最大长度
for(int i = 0; i < stickNum; i++)
{
scanf("%d", &n);
sticks[i] = n;
}
sort(sticks, sticks+stickNum, cmp);//从小到大排序
int left = 0, right = sticks[0];//长度范围[0,10]保证第一个棍棒 为一段
int mid, num;
while(left < right)
{
mid = left + (right - left) /2;
num = cut(sticks,mid);//得到单段 长度最大值
if(num < K)
right = mid;
else
left = mid+1;
}
printf("%d", left);//往右走 然后 满足条件的第一个答案 即是得到的最新的最左边 left
return 0;
}