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件衣服所需要的最短时间
样例输入
3 2 3 9 5
3 2 3 6 5
样例输出
3
2
题目链接
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;
}
探讨了在有限的烘干资源下,如何高效地将多件不同含水量的衣物烘干至干燥状态的算法问题。通过二分查找确定最少烘干时间,考虑自然风干与机器烘干的结合,特别处理了K=1的特殊情况。
793

被折叠的 条评论
为什么被折叠?



