POJ 3104- Drying-二分

来源:互联网 发布:js定义类的对象和方法 编辑:程序博客网 时间:2024/05/10 04:03

  3 题意:烤衣服,每分钟水量少k。自然干,每分钟少1. 4            给10^5件衣服的水量。 5            求最小的时间,全部的衣服都干了。 6 不能理解成,烤衣服的时候,也自然干。k已经包括了。 7  
对于烤衣服,把每分钟减少的水量看作k-1,这样就可以把所有衣服都当作一直在自然干就好了。

二分时间。对于每个时间判断是否合法可以这样:

  水量少于时间x自然就干了,只看大于x的,然后累计(a[i]-x)(k-1)    要减x是因为当成在x时间内已经自然干了x份水,然后计算剩下的水要烘干多久最终如果这样计算得到的时间大于x  则不合法,如果小于等于x 则合法



#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <iostream>#include <queue>#include <map>#include <set>#include <vector>using namespace std; __int64 n,m;__int64 a[100005];__int64 slove(__int64 x){__int64 ans=0;__int64 it=upper_bound(a+1,a+1+n,x)-a; for (__int64 i=it;i<=n;i++){ans+=(a[i]-x)/(m-1);if ((a[i]-x)%(m-1))ans++; }if(ans<=x) return 1;return 0;}int main(){ __int64 i;scanf("%I64d",&n);__int64 sum=0;for (i=1;i<=n;i++){scanf("%I64d",&a[i]);if (a[i]>sum) sum=a[i];}sort(a+1,a+1+n);scanf("%I64d",&m);__int64 l,r;if (m==1){printf("%d\n",sum);return 0;}l=1,r=sum+1;while(l<r){__int64 k=(l+r)/2;if(slove(k) )r=k;elsel=k+1;}                   printf("%I64d\n",l);return 0;}


0 0
原创粉丝点击