电缆公司的烦恼
Description
某地的居民决定举办一场程序比赛.评委会保证要组织一次最公正的比赛.它将选手的电脑以"星"形的结构连接并连到一个中心计算机.组织者决定将所有电脑以同样的距离连到该中心计算机上.组织者要求电缆公司提供一定量的等长的电缆,并希望电缆越长越好从而使选手之间的距离尽可能远.电缆公司的老板知道他的电缆长度精确到厘米,而且他能以厘米为单位切割电缆.但是这次他不知道所需的电缆的长度.郁闷的老板找到你,希望你能提供一个程序可以算出为达到所需求数量,这些电缆最多能被切成多长.
Input
第一行N,K表示公司里的电缆数和所需的电缆数.
接下来N行为没跟电缆的长度(1米到100千米之间),精确到厘米(小数点后2位)
接下来N行为没跟电缆的长度(1米到100千米之间),精确到厘米(小数点后2位)
Output
一个实数(表示最长的满足要求的电缆长度)
思路:
写这题的时候才发现只要const一个变量为常数,就可以开一个这么大的数组。
递归,二分,最长电缆长度范围是【0,max】,在该区间内递归不断改变左值与右值直到左值+1=右值或左值等于右值,然后取左值(较小数)。
#include <cstdio>
const int length=100000+10;
int a[length],n,m;
void digui(int max)
{
int L=0,R=max+1,mid;
int ans=0;
while(L+1<R){
ans=0;
mid=(L+R)/2;
for(int i=0;i<n;i++)
ans+=a[i]/mid; //当前电缆数
if(ans<m)R=mid;
else L=mid;
}
printf("%.2f",L/100.00);
}
int main()
{
int max=0;
scanf("%d%d",&n,&m);
double t;
for(int i=0;i<n;i++){
scanf("%lf",&t);
a[i]=t*100; //浮点型变整形
if(max<a[i])
max=a[i];
}
digui(max);
getchar();
getchar();
return 0;
}