poj 1064 Cable master

很水的二分找答案,不过,需要注意精度的控制
#include <stdio.h>

const double eps= 1e-8;

int data[10010], m, n, ans;

bool judge(int mod)
{
    
int cnt= 0;
    
for ( int i = 0 ; i < n ; i++ )
        cnt
+= data[i]/mod;
    
return  cnt >= m;
}

int main()
{
    
while ( 2 == scanf("%d%d"&n, &m ) )
    {
        
int i, sum= 0;
        
bool flag= true;
        
double t;
        
for ( i = 0 ; i < n ; i++ )
        {
            scanf(
"%lf"&t);
            data[i]
= (int)((t+eps)*1000);
            sum
+=data[i];
            (flag 
&& sum < m*10? flag= true : flag= false;
        }
        
if ( flag )
        {
            printf(
"0.00\n");
            
continue;
        }
        
int left= 0, right= 1000000000, mid;
        
while ( left < right )
        {
            mid
= left+right>>1;
            
if ( judge(mid) )
                left
= mid+1;
            
else ans = right = mid-1;
        }
        
int a= ans/1000, b= (ans-a*1000)/10, c= (ans-a*1000)%10;
        printf(
"%d.", a);
        
if ( c > 9 )
            b
++;
        
if ( b < 10 )
            printf(
"0%d\n", b);
        
else printf("%d\n", b);
    }
    
return 0;
}

posted on 2011-10-04 19:47 purplest 阅读(400) 评论(0)  编辑 收藏 引用 所属分类: others


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

常用链接

留言簿

随笔分类(70)

随笔档案(68)

ACMer

搜索

最新随笔

最新评论