考察:二分

第一次做这题我还以为是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 }