题意:给出一些长度的网线N,求等长最大的长度M

思路:很好形成,很明显的二分,然而让人特无语的是double,被精度整了好几次后现在看到都挺虚的

直接计算肯定要用到eps,想了想,用字符串转换,还是wa了N次之后,看discuss,还是没过,最后看了!的博客,终于改过了,写了好久--|||

code:

#include <iostream>
#include <cstdio>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <string>
#define nMAX 10002
using namespace std;
int len[nMAX];
int Max=0, m, n, cnt;
bool Check(int l);
int Dichotomy()
{
int low=1, mid, high=Max;
while(low<high)
{
if(low==high-1)
{
if(!Check(high)) high=low;
break;
}
mid=(low+high)>>1;
if(Check(mid)) low=mid;
else high=mid-1;
}
if(!Check(low)) return low;
else return high;
}
bool Check(int l)
{
cnt=0;
for(int i=0; i<n; i++)
{
cnt+=len[i]/l;
if(cnt>=m) return 1;
}
return 0;
}

int main()
{
scanf("%d%d", &n, &m);
memset(len, 0, sizeof(len));
for(int i=0; i<n; i++)
{
char an[100];
scanf("%s", an);
int lengh=strlen(an);
for(int j=0; j<lengh; j++)
{
if(an[j]=='.') continue;
len[i]=len[i]*10+an[j]-'0';
}
if(Max<len[i]) Max=len[i];
}
if(!Check(1)) printf("0.00\n");
else
printf("%.2f", 1.0*Dichotomy()/100);
return 0;
}

 

posted on 2011-07-04 22:13  FreeAquar  阅读(486)  评论(0编辑  收藏  举报