考察:二分
第一次做这题我还以为是dfs.....
思路:
首先烘干时间符合单调性,二分烘干时间,难点在如何写判断函数.首先两种情况:
- a[i]<=s,直接无视.
- 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 }