POJ3104 Drying [二分]
来源:互联网 发布:天融信防火墙配置端口 编辑:程序博客网 时间:2024/04/29 23:01
题目不是很难
大体思路:
题意:烘干机,给出一堆衣服的水分a[i],在不加烘干机情况下自动每一分钟减少1水分,每分钟可以变改衣服(i)到烘干机中,每分钟减少k水分,求最少需要多少时间。
题解:第一时间就想到使用二分枚据答案+验证这种思路,不过这题还是有些陷阱需要注意。
1. 验证答案时,如果 a[i] <= mid,让它自然烘干即可 ; 如果a[i] > mid,那么烘干这件衣服可以分成两段时间:使用烘干机时间x1 + 自然烘干时间x2,那么可以列出等式:mid = x1 + x2; a[i] <= kx1+x2;于是得x1 >= (a[i] -mid)/(k-1);即得使用烘干机的最少时间x1
2.注意当k==1时,k-1 == 0,需要特殊处理,直接打出ans = maxV
3.注意当求left+right时,结果可能超出范围,正确的方法应该是left + (right - left)*0.5;
犯了一个很2的错误,ceil(int/int),应该是ceil(int*1.0/int)
再次验证我的二分写法没错,哇哈哈哈
标准的
while l<r
l=mid+1;
r=mid;
mid=l+(r-l)/2;
代码如下
#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <algorithm>using namespace std;long long num[111111];int main(){//cout<<"here"<<endl;//cout<<ceil(3.4)<<endl;//cout<<ceil(4)<<endl;//cout<<"end"<<endl;long long n,k;long long maxn=0;while(scanf("%lld",&n)!=EOF){for(long long i=1;i<=n;i++){scanf("%lld",&num[i]);maxn=max(maxn,num[i]);}sort(num+1,num+1+n);scanf("%lld",&k);if(k==1){printf("%lld\n",maxn);continue;}long long l=1,r=maxn,mid=(r+l)/2;long long ans=0;while(l<r){//mid=(l+r)/2;long long sum=0;for(long long i=1;i<=n;i++){if(num[i]>mid)sum+=ceil((num[i]-mid)*1.0/(k-1));}if(sum>mid)l=mid+1;else if(sum<=mid){r=mid;}mid=(l+r)/2;}printf("%lld\n",mid);}}
0 0
- POJ3104 Drying [二分]
- POJ3104 Drying 二分搜索
- POJ3104:Drying(二分)
- [二分]poj3104 Drying
- poj3104 Drying(二分)
- POJ3104 Drying(二分答案)
- POJ3104 Drying (二分的力量2)
- POJ3104 Drying
- POJ3104 Drying
- POJ3104--Drying
- POJ3104-Drying
- POJ3104 Drying
- POJ3104-Drying
- CSU-ACM2017暑假集训2-二分搜索 poj3104-drying
- poj3104 二分
- POJ3104 二分
- poj3104二分
- poj3104 二分
- 最大访客数
- 剑指offer 面试题4 替换空格
- 部署Web项目
- Add Binary
- 黑马程序员:一道看似简单的题(删除List中的元素)
- POJ3104 Drying [二分]
- 一张图精通MapReduce的原理
- leetcode-Reorder List
- 谓词定义中过滤的常用方法, 大于,小于,等于, XX 和 XX,XX 或XX,X 开头, X 结尾,包含 X等
- vim的保存文件和退出命令
- 甲芬那酸东风南方施工方法,房价过不久啊
- java 类加载与常量池
- 9 PHP Apache函数
- 啊豆腐干后赶到凤凰,黑色的同时他恢复风格