起初没考虑超时问题,脑子里想到了二分就用了二分。。。。
后来再看其实不止是超时的问题,忽略了小木棒能否组成i个一样长的大木棒
看了csdn才知道要用递归反过来拆解,拆解这i个一样长的木棒反过来能不能切成输入数据的形状。。。
#include<iostream>
using namespace std;
int bsearch(int l, int r,int sum)
{
if (sum % l == 0) { return l; }
while (l<=r) {
int mid = (l + r) / 2;
if (sum % mid == 0)return mid;
else if (sum % mid <= mid)r = mid;
else l = mid;
}
}
int main() {
int n = 0;
while (scanf_s("%d",&n) && n != 0) {
int mmax = 0, mmin = 0, sum = 0, a[65] = { 0 };
for (int i = 1; i <= n; i++)
{
scanf_s("%d", &a[i]);
mmax = max(mmax, a[i]);
sum += a[i];
}
int num = bsearch(mmax, sum,sum);
printf("%d\n", num);
}
return 0;
}//这是二分法,很遗憾的超时了
递归看得我好难受,看了好久才看明白。。。