POJ 3104 Drying (二分求最小值)

开始一看题目的时候,就想着二分时间,然后看可不可行。然后在写ok判断可不可行的时候,莫名的感觉不用二分

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>

using namespace std;
const int maxn = 100005;
int n,k;
int a[maxn];
bool cmp(int a1,int b2)
{
    return a1>b2;
}
void ok()
{
    int temp=a[0];
    int time=0;
    int i=1;
    while(i<n)
    {
        while(temp-k<0)
        {
            if(i>=n) break;
            temp+=(a[i]-time);
            i++;
        }
        temp-=k;
        time++;
    }
    if(temp>0) time++;
    printf("%d\n",time);
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&k);
    sort(a,a+n,cmp);
    ok();
    return 0;
}

然后WA到想哭。之后发现出了问题,1.题目中说了一分钟内只能放一件衣服进烘干机,,我这里想的是一分钟内干了后,拿出来再放别的。(额。。更节约。。)。2.改好了之后,先将水多的放进烘干机,然后把时间记下来,后面如果有自然干的时间大于这个时间的话,就放进烘干机,更新时间。但是这个又有点问题,水多的有可能一部分时间在烘干机里,一部分在外面自然烘干时间更短。
然后还是老实的二分吧
//注意转long long ~~~~

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>

using namespace std;
const int maxn = 100005;
long long n,k;
long long a[maxn];
bool cmp(long long a1,long long b1)
{
    return a1>b1;
}
int ok(long long time)
{
    long long cnt=0;
    long long i=0;
    for(i=0;i<n;i++)
    {
        if(a[i]<=time) break;
        else {
            cnt+=(a[i]-time+k-2)/(k-1);//假设全部自然烘干,然后放烘干机里的就是k-1
        }
    }
    if(cnt>time)  return 1;
    else return 0;
}
int main()
{
    scanf("%I64d",&n);
    for(long long i=0;i<n;i++){
        scanf("%I64d",&a[i]);r+=a[i];
    }
    scanf("%I64d",&k);
    sort(a,a+n,cmp);
    if(k==1) cout<<a[0]<<endl;
    else{
        long long l=0, r=a[0];
        while(l<=r)
        {
            long long mid=l+(r-l)/2;
            if(ok(mid)) l=mid+1;
            else r=mid-1;
        }
        cout<<l<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值