二分答案
假设当前二分的答案为 t,那么:
对于ai <= t的衣服,显然让它们自然风干就可以了。
对于ai > t的衣服,我们需要知道该衣服最少用多少次烘干机。
设该衣服用了x1分钟风干,用了x2分钟烘干机。
那么有 x1 + x2 = t 和 ai <= x1 + x2 * k,联立两式可得 x2 >= (ai - t) / (k - 1),即最少使用次数为[(ai - t) / (k - 1)] 的最小上界。
最后,判断一下总使用次数是否少于 t 即可。
记得不要除零
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
   | 
 
 
 
  #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <queue> #include <set> #include <vector> using namespace std;
  const int INF = ~0u>>1; typedef pair <int,int> P; #define MID(x,y) ((x+y)>>1) #define iabs(x) ((x)>0?(x):-(x)) #define REP(i,a,b) for(int i=(a);i<(b);i++) #define FOR(i,a,b) for(int i=(a);i<=(b);i++) #define pb push_back #define mp make_pair #define print() cout<<"--------"<<endl
  #define maxn 100050 typedef long long ll; ll k,num[maxn],ans; int n;
  bool check(ll mid){ 	ll cnt = 0; 	for (int i = 0; i < n; i ++){ 		if (num[i] <= mid) continue;  		cnt += (num[i] - mid + k - 2)/(k - 1); 		 		if (cnt > mid) return false; 	} 	return true; }
  ll solve(){ 	ll l = 1,mid, r = ans; 	while (l <= r){ 		mid = MID(l,r); 		if (check(mid)) { 			r = mid - 1; 			ans = mid; 		}else l = mid + 1; 	} 	return ans; }
  int main(){ 	scanf("%d", &n); 	ans = 0; 	for (int i = 0; i < n; i ++){ 		scanf("%lld", &num[i]); 		ans = max(num[i],ans); 	} 	scanf("%lld", &k); 	printf("%lldn",k == 1?ans : solve()); 	return 0; }
 
  |