Drying
题目链接:Click Here~
题目分析:
给出N件带水的衣服,你有两种选择可以把某件衣服给弄干。一是用烘干机可以每分钟烤干衣服的K滴水。二是每分钟衣服会自然烘干一滴水。而用烘干机的时候就不再自然烘干了。而每件衣服所带的水滴是不一样多的。现在问你最少要多少时间可以把衣服全烘干。
思路分析:
先二分枚举时间。但是判断的条件有点难想到,一开始用暴力判断结果超时了。后来看了博客后才知道只要转换一下公式就可以了判断了。详细解释过程请看代码。
#include <iostream> #include <algorithm> #include <queue> #include <cstdio> #include <cstring> #include <cmath> using namespace std; const int MAXN = 100000 + 10; const int INF = ~0U >> 2; int a[MAXN],sum[MAXN]; int N,K; /* 假设烘干时间是x,则自然风干时间为mid - x K*x + (mid - x) >= a[i] x >= (a[i] - mid)/(K - 1) (K != 1) */ bool C(int mid){ unsigned long long sum(0); for(int i = 0;i < N;++i){ int more = a[i] - mid; if(more > 0){ sum += ceil(more + K - 1 / K); //ceil } } return sum <= mid; } //二分时间 void solve(){ int lb = -1,ub = INF; while(ub - lb > 1){ int mid = (lb + ub) / 2; if(C(mid)) ub = mid; else lb = mid; } printf("%d\n",ub); } int main() { while(~scanf("%d",&N)){ for(int i = 0;i < N;++i) scanf("%d",&a[i]); scanf("%d",&K); if(K == 1){ //特判,防止分母为0 printf("%d\n",*max_element(a,a+N)); continue; } K--; solve(); } return 0; }
时间: 2024-12-14 13:59:43