Drying
直接上中文
Descriptions
每件衣服都有一定单位水分,在不使用烘干器的情况下,每件衣服每分钟自然流失1个单位水分,但如果使用了烘干机则每分钟流失K个单位水分,但是遗憾是只有1台烘干机,每台烘干机同时只能烘干1件衣服,请问要想烘干N件衣服最少需要多长时间?
输入
多组输入
第一行输入N,表示有N件衣服,第二行输入N件衣服的水分ai,第三行表示烘干机每分钟烘干水分K
其中
1 ≤ N ≤ 100 000,1 ≤ ai ≤ 10^9,1 ≤ K≤ 10^9输出
输出
烘干N件衣服所需要的最短时间
样例输入
样例输出
题目链接
https://vjudge.net/problem/POJ-3104
二分的时间在算的时候首先减去这个时间作为自然风干,然后用烘干机的话每分钟就只能掉k-1的水(因为烘干的时候是不会自然风干的,然后需要特殊处理k=1的情况)
注意要用scanf printf 不然会超时
AC代码
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #include <sstream> #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #define Mod 1000000007 #define eps 1e-6 #define ll long long #define INF 0x3f3f3f3f #define MEM(x,y) memset(x,y,sizeof(x)) #define Maxn 100000+100 using namespace std; int N,K; ll l,r,mid;//左右中 ll a[Maxn]; ll ans; int solve() { mid=(l+r)/2;//预判时间 ll cnt=0;//实际时间 for(ll i=0; i<N; i++) { if(a[i]<=mid)//小于预判时间,即可以在规定时间内自然风干 continue; else//需要借助烘干机 cnt+=(a[i]-mid+K-2)/(K-1);//所需时间 if(cnt>mid)//实际时间大于预判时间,失败 return 0; } return 1; } int main() { while(scanf("%d",&N)!=EOF) { l=0;//初始化 r=0; for(ll i=0; i<N; i++) { scanf("%lld",&a[i]); r=max(r,a[i]); } scanf("%d",&K); if(K==1)//K==1,特殊处理 cout<<r<<endl; else { ans=INF;//答案最小时间 while(l<=r) { if(!solve())//失败,即预判时间小了,需要增大预判时间 l=mid+1; else//成功,减少预判时间,看是否有跟小的答案 { ans=min(mid,ans); r=mid-1; } } printf("%lld\n",ans); } } return 0; }