2016寒假训练——二分

来源:http://poj.org/problem?id=3104

POJ3104

用模拟会超时,所以考虑用二分节约时间

首先分析,实际上是每一次都是去烘干水量最大的,风干其他的,然后烘完再排序一下,重复这一操作,直到所有的都为1。当然,模拟显然是会超时的。所以我们这样考虑,我们这样考虑,如果对于一个时间t,我们的有一部分衣服就会自然风干,有一部分衣服需要自己来烘干,所以我们来二分列举时间。

这里有几个注意点(网上其他题解中提到的):

1.a/b向上取整有(a+b-1)/b;

2.注意k==1的情况

大概就是这样。。。

AC代码:(本人在VJ上做的这一题,不是在POJ,有人和我说可能有区别,这。。。就很尴尬了)

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Maxn=100100;
int a[Maxn];
bool judge(int x,int n,int k){
    int t=0;
    for(int i=0;i<n;i++){
        if(a[i]>x){
            t+=(a[i]-x+k-2)/(k-1);
            //这个地方就是用的那个技巧
            //计算烘干a[i]的时间,并叠加
            if(t>x)return false;//如果大于我假设的,就要判断为false
        }
    }
    return true;
}
int main(){
    int n,k;
    long long ans=0,t;
    while(scanf("%d",&n)!=EOF){
        ans=0;
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        scanf("%d",&k);
        sort(a,a+n);
        if(k==1){
            printf("%d\n",a[n-1]);
            continue;
        }//k==1的特殊处理
        int l=1;
        int r=a[n-1];
        while(l<=r){
            int mid=l+(r-l)/2;
            int sum=0;
            if(judge(mid,n,k)){
                ans=mid;
                r=mid-1;
            }
            else{
                l=mid+1;
            }
        }
        printf("%lld",ans);
    }
    return 0;
}
欢迎各位看官大牛点评。橙子在这谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值