设为首页 加入收藏

TOP

poj 3104 二分想法
2015-11-21 01:02:33 来源: 作者: 【 】 浏览:1
Tags:poj 3104二分 想法

给你n个数表示含水量,给你一个k表示每分钟洗衣机能脱水k滴 每分钟没有在洗衣机的衣服自动脱水一滴,求把全部水托干最小时间,怎么都没想到居然是二分;==!!

好吧,二分枚举最小时间mid,然后求实际所需时间再 经行判断, 如果枚举时间为mid,对每件衣服num【i】 如果num【i】小于mid 很显然直接自然干最好 而对于num【i】大于mid所用时间为t,设自然干时间为x1 用洗衣机的时间为x2, 很显然 x1+x2小于等于mid x2*k+x1小于等于num【i】 可以求出t小于等于(num【i】-mid)/(k-1) 这里要注意应为衣服一定要全干 **所以存在一个取整的操作** 把所有t加起来与mid判断就ok了

?

?

#include
  
   
#include
   
     #include
    
      #include
     
       using namespace std; __int64 num[100010]; int max(int a,int b) { return a>b?a:b; } int main() { int n,i,j,k; while(~scanf("%d",&n)) { __int64 left=1,right=0,mid; for(i=1;i<=n;i++) { scanf("%I64d",&num[i]); right=max(right,num[i]); } scanf("%d",&k); if(k==1) printf("%I64d\n",right); else { __int64 ans; while(left<=right) { mid=(left+right)/2; __int64 sum=0; for(i=1;i<=n;i++) if(num[i]>mid) { sum+=ceil((double)(num[i]-mid)/(double)(k-1)); } if(sum<=mid) { ans=mid; right=mid-1; } else left=mid+1; } printf("%I64d\n",ans); } } return 0; }
     
    
   
  

?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 1700 Crossing River(贪心) 下一篇C++解析JSON(jsonCpp)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: