poj3104 Drying---二分

题目链接:https://vjudge.net/problem/POJ-3104

题意:每件衣服都有一定单位水分,在不使用烘干器的情况下,每件衣服每分钟自然流失1个单位水分,但如果使用了烘干机则每分钟流失K个单位水分。只有1台烘干机,每台烘干机同时只能烘干1件衣服,烘干N件衣服最少需要多长时间?

有点麻烦的是水分的自然流失,所以如果能先得出时间就好了;又因为时间长更有可能全部烘干(单调性),所以考虑二分答案。对于二分的m,判断能不能让全部衣服干。如果ai<=m,那么只要让水分自然流失就行,所以只要对ai>m的情况用烘干器。考虑对于每个ai需要烘干的时间t,则有 k*t+(m-t)>=ai,即t>=(ai-m)/(k-1),向上取整。如果m小于额外时间的和,则不能全部烘干,check返回false。对于k=1的情况要特判一下

#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn=1e5+10;
int t,n,i,j,k,l,r;
int a[maxn];

bool check(int m){
	int time=m;
    for (int i=1;i<=n;i++){
      if (a[i]<=m) continue;
      int t=(a[i]-m)/(k-1); //*
      if ((a[i]-m)%(k-1)!=0) t++;
      time-=t;
      if (time<0) return false;
	}
	return true;
}

int main(){
    while (~scanf("%d",&n)){
      int tmax=0;
	  for (i=1;i<=n;i++) {
	    scanf("%d",&a[i]);tmax=max(tmax,a[i]);
      }
	  scanf("%d",&k);
	  if (k==1){ //*
	    printf("%d\n",tmax);continue;
	  }
	  l=0;r=1e9;
	  while (r-l>1){
	    int m=(l+r)/2; 
	    if (check(m)) r=m;else l=m;
	  }
	  printf("%d\n",r);
    }
	return 0;
}

  

posted @ 2020-07-30 14:08  coastal_taipan  阅读(115)  评论(0编辑  收藏  举报