最让HSQ学长头疼的就是洗衣服了。洗完之后,每件衣服都有一定单位水分,在不使用烘干器的情况下,每件衣服每分钟自然流失1个单位水分,但如果使用了烘干机则每分钟流失K个单位水分。令人遗憾是HSQ所在的宿舍楼只有1台烘干机,而每台烘干机同时只能烘干1件衣服,请问要想烘干N件衣服最少需要多长时间?

输入

第一行输入N,表示有N件衣服,第二行输入N件衣服的水分ai,第三行表示烘干机每分钟烘干水分K
其中
1 ≤ N ≤ 100 000,1 ≤ ai ≤ 10^9,1 ≤ K≤ 10^9输出

输出烘干N件衣服所需要的最短时间

样例输入 

3
2 3 9
5

3
2 3 6
5

样例输出 

3

2
一、
看一下数据大小就知道肯定不是一个一个衣服的求时间,既然不是从衣服下手,那我们就肯定要从时间上面下手了。。。对时间二分来确定时间是多少的时候才适合
所用时间最短是1分钟,最长时间是把水份最多的衣服晒干所用的时间(不用机器)
那么之后就要对二分的时间进行判定来确定它是否符合。。
1、如果衣服上面的水分小于这个二分的时间,那他就可以不用机器,直接晒干
2、如果水分大于,那就算出来他所需要的时间
这个时候他的水分可以看作是以两种方式损失的
1、自然晒干
2、机器催干(可以说是把机器每分钟晒干的水分看成两部分)
设其x1为自然晒干的时间
x2为机器晒干的时间
则有
1、mid=x1+x2
2、v[i]<=x1+x2*(k-1)
结出来得到:x2>=(v[i]-mid)/(k-1) 即作向上取整既可以
向上取整:
假如:a/s是一个小数
为了向上取整可以写作这样(a+s)/s
那么x2>=(v[i]-mid+k-2)/(k-1)
二、
之后就要说一下二分法在不同题之间的区别
1、如果是要在一个单调序列中找一个确定的值
//https://blog.csdn.net/dijiaxing1234/article/details/81178097
public static int rank(int key,int nums[])
{
    //查找范围的上下界
    int low=0;
    int high=nums.length-1;
    //未查找到的返回值
    int notFind=-1;
    while(low<=high)
    {
        //二分中点=数组左边界+(右边界-左边界)/2
        //整数类型默认取下整
        int mid=low+(high-low)/2;
        //中间值是如果大于key
        if(nums[mid]>key)
        {
            //证明key在[low,mid-1]这个区间
            //因为num[mid]已经判断过了所以下界要减一
            high=mid-1;
        }else if(nums[mid]<key)
        {
            //证明key在[mid+1,high]这个区间
            //同样判断过mid对应的值要从mid+1往后判断
            low=mid+1;
        }
        else
        {
            //查找成功
            return mid;
        }
    }
    //未成功
    return notFind;
}
2、就像这一道题,是从一段范围中求出来那个值符合本题,这个值是未知的,那就用以下这种方法
#include<stdio.h>
#include<string.h>
typedef long long ll;
ll max(ll x,ll y)
{
    return x>y ? x: y;
}
ll v[100005];
int main()
{
    ll a,s,d,f,g;
    scanf("%lld",&a);
    s=0;
    for(int i=1;i<=a;++i)
{
scanf("%lld",&v[i]);
        s=max(s,v[i]);
    }
    scanf("%lld",&d);
    if(d==1) printf("%lld\n",s);
    else
    {
        f=0;
        g=s;
        ll mid;
        while(g-f>1) //要保证他们中间有一个来隔离g和f,否则这两个数就相邻了,或者f在g的右边这个样子【f,g】就不能成立,至于f==g的时候此处值在之前就证明过不可取
        { //因为f=0不会是结果,s分出来讨论过了,所以这两个值都不会是结果,之后讨论他们的一半,如果这个mid不行,才会赋值给f或g
            mid=(f+g)/2;
            ll temp=0;
            for(int i=1;i<=a;++i)
            {
                if(v[i]<=mid) continue;
                ll ans=(v[i]-mid+d-2)/(d-1);
                temp+=ans;
            }
            if(temp>mid) f=mid;
            else  g=mid; 因为本题求的是最短时间,那么如果有一个值满足了,不能直接跳出来,还要接着搜索看看有没有比他更短的时间,所以这里time==mid的时候不能跳出循环
        }
        printf("%lld\n",g);
    }
    return 0;
}
本人菜鸡一枚,如有错误,求指出!

POJ 3104 Drying的更多相关文章

  1. POJ 3104 Drying(二分答案)

    题目链接:http://poj.org/problem?id=3104                                                                  ...

  2. poj 3104 Drying(二分查找)

    题目链接:http://poj.org/problem?id=3104 Drying Time Limit: 2000MS   Memory Limit: 65536K Total Submissio ...

  3. POJ 3104 Drying 二分

    http://poj.org/problem?id=3104 题目大意: 有n件衣服,每件有ai的水,自然风干每分钟少1,而烘干每分钟少k.求所有弄干的最短时间. 思路: 注意烘干时候没有自然风干. ...

  4. POJ 3104 Drying(二分答案)

    [题目链接] http://poj.org/problem?id=3104 [题目大意] 给出n件需要干燥的衣服,烘干机能够每秒干燥k水分, 不在烘干的衣服本身每秒能干燥1水分 求出最少需要干燥的时间 ...

  5. POJ 3104 Drying [二分 有坑点 好题]

    传送门 表示又是神题一道 Drying Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9327   Accepted: 23 ...

  6. poj 3104 Drying(二分搜索之最大化最小值)

    Description It is very hard to wash and especially to dry clothes in winter. But Jane is a very smar ...

  7. POJ 3104 Drying(二分

    Drying Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 22163   Accepted: 5611 Descripti ...

  8. POJ 3104 Drying (经典)【二分答案】

    <题目链接> 题目大意: 有一些衣服,每件衣服有一定水量,有一个烘干机,每次可以烘一件衣服,每分钟可以烘掉k滴水.每件衣服没分钟可以自动蒸发掉一滴水,用烘干机烘衣服时不蒸发.问最少需要多少 ...

  9. POJ 3104 Drying (二分+精度)

    题目链接:click here~~ [题目大意]: 题意:有一些衣服,每件衣服有一定水量,有一个烘干机,每次能够烘一件衣服,每分钟能够烘掉k单位水. 每件衣服没分钟能够自己主动蒸发掉一单位水, 用烘干 ...

随机推荐

  1. Git—分支管理

    Git—分支管理 分支学习:branch称为分支,默认仅有一个名为master的分支.一般开发新功能流程为:开发新功能时会在分支dev上进行,开发完毕后再合并到master分支. branch相关常用 ...

  2. JAVA并发包学习

    1)CyclicBarrier一个同步辅助类,允许一组线程相互等待,直到这组线程都到达某个公共屏障点.该barrier在释放等待线程后可以重用,因此称为循环的barrier 2)CountDownLa ...

  3. AngularJS 1.x系列:AngularJS过滤器(4)

    1. AngularJS过滤器(Filter)使用方法 AngularJS中过滤器(Filter)主要功能是格式化数据. AngularJS过滤器使用方法有3种: ◊ 在表达式{{}}中使用 ◊ 在指 ...

  4. Python——网络编程基础

    一.TCP/IP 是Internet的基础协议,分四层应用层(HTTP,SMTP),传输层(TCP/UDP),网络层(IP),接口层 二.常用默认端口号 80-TCP-HTTP 23-TCP-TELN ...

  5. Django初印象之视图(view)

    一.view的初印象 一个视图函数(类),简称视图.我们发起web请求时,返回的web响应.[大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中.] ...

  6. UVA 10618 Tango Tango Insurrection

    https://vjudge.net/problem/UVA-10618 题目 你想学着玩跳舞机.跳舞机的踏板上有4个箭头:上.下.左.右.当舞曲开始时,屏幕上会有一些箭头往上移动.当向上移动箭头与顶 ...

  7. Nginx 进程间如何共享内存

    L:37 Nginx 针对多进程用的是自旋锁(占用共享内存时间比较短的情况下否则可能会影响性能)注:自旋锁是不停的请求共享内存 而原先的信号量是等待占用者释放后通知等待的进程

  8. Flask 构建微电影视频网站(四)

    后台管理 实现后台管理系统使用flask sqlalchemy结合mysql数据库进行增删改查操作.分页的使用.路由装饰器定义.模板中变量调用.登录会话机制.上传文件.flask wtforms表单使 ...

  9. 怎样在ISE14.7中固化FLASH文件

    前言 当工程开发完成后,bit文件类型掉电后会消失,而此时采用FLASH固化就很重要了. 软件版本:ISE14.7 流程 1.对生成FLASH文件进行设置:配置速率为33,选择66貌似配置失败,中庸之 ...

  10. mongoDB 文档操作_查

    基本查询命令 find 查找复合条件的所有文档 命令 db.collection.find(query,field) 参数 query 查找条件 格式: {ssss:"xxx"}是 ...