【題意】:給出n件剛洗完的衣服,每件衣服有一個屬性ai,表示改衣服在自然風干的條件需要ti分鐘?,F(xiàn)在有一臺烘干機,每分鐘你可以選擇把任意一件衣服放進去,那么這件衣服風干的時間就減少k分鐘,而每分鐘對于不在烘干機的衣服,風干時間都減少1。問最少用多少時間使所有衣服都干了。
【題解】:直接二分答案,然后判斷答案的正確性。
假設(shè)當前二分的答案為 t,那么:
對于ai <= t的衣服,顯然讓它們自然風干就可以了。
對于ai > t的衣服,我們需要知道該衣服最少用多少次烘干機。
設(shè)該衣服用了x1分鐘風干,用了x2分鐘烘干機。
那么有 x1 + x2 = t 和 ai <= x1 + x2 * k,聯(lián)立兩式可得 x2 >= (ai - t) / (k - 1),即最少使用次數(shù)為[(ai - t) / (k - 1)] 的最小上界。
最后,判斷一下總使用次數(shù)是否少于 t 即可。
【代碼】:
1 #include "iostream"
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 #include "cmath"
8 #include "string"
9 #include "cctype"
10 #include "map"
11 #include "iomanip"
12 using namespace std;
13 #define pb push_back
14 #define lc(x) (x << 1)
15 #define rc(x) (x << 1 | 1)
16 #define lowbit(x) (x & (-x))
17 #define ll long long
18 #define maxn 100050
19 int n;
20 ll val[maxn], ans, k;
21
22 bool check(ll t) {
23 ll cnt = 0;
24 for(int i = 0; i < n; i++) {
25 if(val[i] > t) {
26 cnt += (val[i] - t + k - 2) / (k - 1);
27 if(cnt > t) return false;
28 }
29 }
30 return true;
31 }
32
33 void solve() {
34 ll l = 1, r = ans;
35 while(l <= r) {
36 ll mid = (l + r) >> 1;
37 if(check(mid)) ans = mid, r = mid - 1;
38 else l = mid + 1;
39 }
40 printf("%lld\n", ans);
41 }
42
43 int main() {
44 while(~scanf("%d", &n)) {
45 ans = 0;
46 for(int i = 0; i < n; i++) {
47 scanf("%lld", &val[i]);
48 ans = max(ans, val[i]);
49 }
50 scanf("%lld", &k);
51 if(k == 1) printf("%lld\n", ans);
52 else solve();
53 }
54 return 0;
55 }
56