天天看點

poj 1064 java_poj1064 二分,注意精度!

Cable master

Time Limit: 1000MS

Memory Limit: 10000K

Total Submissions: 35269

Accepted: 7513

Description

Inhabitants of the Wonderland have decided to hold a regional programming contest. The Judging Committee has volunteered and has promised to organize the most honest contest ever. It was decided to connect computers for the contestants using a "star" topology - i.e. connect them all to a single central hub. To organize a truly honest contest, the Head of the Judging Committee has decreed to place all contestants evenly around the hub on an equal distance from it.

To buy network cables, the Judging Committee has contacted a local network solutions provider with a request to sell for them a specified number of cables with equal lengths. The Judging Committee wants the cables to be as long as possible to sit contestants as far from each other as possible.

The Cable Master of the company was assigned to the task. He knows the length of each cable in the stock up to a centimeter,and he can cut them with a centimeter precision being told the length of the pieces he must cut. However, this time, the length is not known and the Cable Master is completely puzzled.

You are to help the Cable Master, by writing a program that will determine the maximal possible length of a cable piece that can be cut from the cables in the stock, to get the specified number of pieces.

Input

The first line of the input file contains two integer numb ers N and K, separated by a space. N (1 = N = 10000) is the number of cables in the stock, and K (1 = K = 10000) is the number of requested pieces. The first line is followed by N lines with one number per line, that specify the length of each cable in the stock in meters. All cables are at least 1 meter and at most 100 kilometers in length. All lengths in the input file are written with a centimeter precision, with exactly two digits after a decimal point.

Output

Write to the output file the maximal length (in meters) of the pieces that Cable Master may cut from the cables in the stock to get the requested number of pieces. The number must be written with a centimeter precision, with exactly two digits after a decimal point.

If it is not possible to cut the requested number of pieces each one being at least one centimeter long, then the output file must contain the single number "0.00" (without quotes).

Sample Input

4 11

8.02

7.43

4.57

5.39

Sample Output

2.00

題目大意:有n根電纜,你需要k條等同長度的電纜,最後得到的電纜長度最長是多少。

思路分析:初學二分,做這道題的時候感覺和之前做的一道題非常相似,以為可以輕松切掉,可是在做的時候還是出現了問題,

正确的思路應該是化為厘米,然後用整數二分,如果直接用小數二分最後會出現問題四舍五入,對于這些資料

4 2540

8.02

7.43

4.57

5.39

=>0.01

4 2542

8.02

7.43

4.57

5.39

=>0.00

化為整數進行處理則可以避免這些問題,另外要注意二分上下限,下限自然是0,而上限你可以用sum/k,也可以用a[n-1],當出現sum的時候,

就會超過int資料範圍,要用__int64,如果用a[n-1]為上界就不需要開__int64了,再就是寫函數時要判斷是否有死循環,我就寫錯了,狂

TLE不止orz.

代碼:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define LL long long

using namespace std;

const int maxn=10000+100;

const double pi=acos(-1.0);

double a[maxn];

int b[maxn];

int n,k;

__int64 sum;

bool check(int x)

{

int t=0;

for(int i=0;i

{

int m=b[i];

while(m>=x)

{

m-=x;

t++;

if(t>=k) return true;

}

}

return  false;

}

int main()

{

while(scanf("%d%d",&n,&k)!=EOF)

{

sum=0;

for(int i=0;i

{

scanf("%lf",&a[i]);

b[i]=a[i]*100;//将機關化為整數厘米

sum+=b[i];

}

sort(b,b+n);

int l=0,r=b[n-1];

int  ans=0;

while(l<=r)

{

int  mid=(l+r)/2;

if(check(mid))  ans=mid,l=mid+1;

else r=mid-1;

}

printf("%.2lf\n",ans*0.01);

}

return 0;

}