zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",r);
        }
    	return 0;
    }
    

      

  • 相关阅读:
    Autoit对win系统弹窗的操作
    Linux服务器测试网络连通性
    如何给linux配置两个不同网段的ip
    记下看过并觉得非常有用的文章
    使用python+selenium对12306车票数据读取
    windows系统mysql安装
    Python使用正则匹配re实现eval计算器
    css3[补1]
    Javascript[2]
    Javascript[1]
  • 原文地址:https://www.cnblogs.com/edmunds/p/13403448.html
Copyright © 2011-2022 走看看