POJ-3104 二分

来源:互联网 发布:sql 恢复查询 编辑:程序博客网 时间:2024/05/19 14:53

题意:给出一堆衣服的水分a[i],在不加吹风机情况下自动每一分钟减少1水分,加吹风机每分钟减少k水分,吹风机只能同时吹一件衣服,求最少需要多少时间。


二分枚举所需时间m,对每一件衣服,a[i]<=m则不用吹风机,否则用 ceil((a[i] -mid)/(k-1))时间的吹风机,如用吹风机总时间小于等于m则m符合条件,二分找出最小m

需要特判k=1


#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;int n,k;int a[100005];int chk(int m){long long cnt=0;for(int i=0;i<n;i++){if(a[i]>m){cnt+=ceil((a[i]-m)*1.0/(k-1));}}if(cnt>m)return 0;return 1;}int main(){int l,r,mid,ans=0;while(scanf("%d",&n)!=EOF){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;}l=1;r=a[n-1];ans=0;while(l<=r){//printf("bs %d %d\n",l,r);mid=(l+r)/2;if(chk(mid)==1){ans=mid;r=mid-1;}else{l=mid+1;}}printf("%d\n",ans);}return 0;}


0 0
原创粉丝点击