Drying POJ - 3104

原题链接

考察:二分

第一次做这题我还以为是dfs.....

思路:

        首先烘干时间符合单调性,二分烘干时间,难点在如何写判断函数.首先两种情况:

  1. a[i]<=s,直接无视.
  2. a[i]>s,需要考虑它用烘干机的时间,注意不能直接算把它烘干完的时间,因为浪费的时间没有利用,假设它用烘干机的时间是t,那么a[i]-t*k<=mid-t(即烘干剩下的水分必须能被剩余时间自动晒干),移项 mid>=a[i]-t*(k-1). mid已知,a[i]已知,k已知,未知是t,因为t是使用烘干机的时间,对所有衣服进行累加,如果和>mid此解不可行.

注意:要特别处理k=1的情况.有除法就要考虑/0

这里多个衣服并行烘干,如果考虑整体很不好考虑,单个考虑就有正在烘干与自然烘干的对立性.

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 typedef long long LL;
 7 const int N = 100010;
 8 int a[N],n,k;
 9 bool check(LL s)
10 {
11     LL res = 0;
12     for(int i=1;i<=n;i++)
13         if(a[i]>s&&k>1)
14             res += (LL)(a[i]-s+k-2)/(k-1);
15         else if(a[i]>s&&k==1) return 0;
16     if(res<=s) return 1;
17     return 0;
18 }
19 int main() 
20 {
21     while(scanf("%d",&n)!=EOF&&n)
22     {
23         LL r = 0;
24         for(int i=1;i<=n;i++) scanf("%d",&a[i]),r=r+a[i];
25         scanf("%d",&k);
26         LL l = 1;
27         while(l<r)
28         {
29             LL mid = l+r>>1;
30             if(check(mid)) r = mid;
31             else l = mid+1;
32         }
33         printf("%lld\n",r);
34     }
35     return 0;
36 }

 

posted @ 2021-03-06 01:56  acmloser  阅读(23)  评论(0编辑  收藏  举报