题目大意:有n件湿的衣服,每件衣服都有相应的湿度,每分钟每件衣服的湿度减1(除了在烘干机里的衣服),现在有一个烘干机,烘干机一分钟可以让一件衣服的湿度降低k,问至少要花多少分钟才能使每件衣服的湿度为0
解题思路:贪心的话,每分钟都要使用到烘干机。
枚举时间,如果湿度小于等于时间的话,就不用考虑了,在枚举时间内肯定会干的
如果湿度大于枚举时间的话,就要考虑一下了,该衣服要在给定时间内湿度变为零的话就要满足该式子,设已经过了cnt分钟了,当前这件衣服的湿度为num[i],枚举的时间为mid,那么 (num[i] - cnt) - n * k <= mid - cnt - n 也就是n =(num[i] - cnt) / (k - 1),如果有余数的话,时间还要+1;
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int maxn=100005; int maze[maxn]; int Max,n,k;; int cmp(const int a,const int b){ return a>b; } bool judge(int mid) { int Time=0; for(int i=0;i<n;i++) { if(maze[i]<mid)//maze递减,如果maze[i]<mid,则i和i后面的衣服一定可以晾干 break; if(Time>mid) return false; Time+=(maze[i]-mid)/(k-1); if((maze[i]-mid)%(k-1)) Time++; } return Time<=mid; } int solve() { int l=0,r=Max,mid; while(l<r) { mid=(l+r)/2; if(judge(mid)) r=mid; else l=mid+1; } return r; } int main () { while(~scanf("%d",&n)) { for(int i=0;i<n;i++) scanf("%d",&maze[i]); scanf("%d",&k); sort(maze, maze+n, cmp); Max=maze[0]; if(k<=1){ printf("%d ",maze[0]); continue; } else printf("%d ",solve()); } return 0; }