题目:
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
在冬天洗衣服特别是烘干衣服非常困难。但小红是一个非常聪明的女孩。她不怕这个无聊的过程,决定使用散热器来加快干燥速度。但是散热器很小,所以一次只能容纳一件衣服。
小红刚洗完n件衣服。第iii件衣服在清洗过程中吸入了ai单位的水。每分钟,每件衣服中含有的水就会减少1单位(只有当衣服还没有完全干燥时)。当所含的水量变为0时,衣服就算干燥了。
每分钟,小红都可以选择一件衣服在散热器上烘干。散热器非常热,所以在散热器上的衣服的水量每分钟会减小k单位(但不会小于0,如果这件衣服含有少于k单位的水,则水量将边为0)。
当所有衣服都干燥时,烘干过程结束。小红希望在尽可能短的时间内进行烘干。她要求你编写一个程序,用于计算给定衣服的最短烘干时间。
输入描述:
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 第一行输入一个整数n,(1≤n≤10^5)。 第二行输入n个整数a1,a2,...,an(1≤ai≤10^9) 第三行输入一个整数k,(1≤k≤10^9)
输出描述:
输出一个整数,表示烘干所有衣服所需要的最小分钟数。
示例1
输入
3
3 2 9
5
输出
3
示例2
输入
3
3 2 6
5
输出
2
思路:(懂二分直接看check函数即可)
《二分区间中的时间--->验证时间是否足够晾干衣服--->缩短区间--->找到答案》
1.先找到一个时间区间([l,r])。(这个区间以答案为分界线,小于答案的都晾不干衣服,大于等于答案的可以晾干衣服。但大于答案的时间不是题目要的时间,我们要找到最小的可以晾干衣服的时间)
2循环判断区间中点(接下来用mid代替)是否可以晾干衣服 --->2.1可以晾干,r = mid;
--->2.2不可以晾干,l = mid + 1;
3.最后区间所留的值为答案。
注:下面的check函数是判断枚举的时间是否可以晾干衣服。(二分的关键)
代码:
#include <stdio.h>
int arr[100010];
int check(int mid,int n,int k)
{
int sum = 0;
for(int i = 0;i<n;i++)
{
if(arr[i]>mid)//这件衣服所需时间t:k*t+(mid-t)>=arr[i]
{
sum+=(arr[i]-mid)/(k-1);
if((arr[i]-mid)%(k-1)) sum++;//上取整
if(sum>mid) return 0;
}
}
return 1;
}
int main()
{
int n = 0,k = 0,r = 0;
scanf("%d",&n);
for(int i = 0;i<n;i++)
{
scanf("%d",&arr[i]);
if(arr[i] > r) r = arr[i];
}
scanf("%d",&k);
if(k==1) goto sc;
int l = 0;
while(l<r)
{
int mid = (l+r) >> 1;
if(check(mid,n,k)) r = mid;
else l = mid+1;
}
sc:
printf("%d",r);
return 0;
}