蜡烛(e.cpp)
题目描述:
奶牛bessie有n根蜡烛,第i根蜡烛的长度是h[i]。bessie最近刚上完小学,只会加减法。它想知道它的n根蜡烛最多能用多少个晚上。由于bessie比较胆小,因此它每天晚上需要点燃c根蜡烛。每根被点燃的蜡烛,它燃烧一个晚上会使得它的长度减少1。一旦蜡烛的长度变成0,那么该根蜡烛就用完了。如果第i个晚上bessie发现蜡烛不够用了,那么bessie最多就只能用i-1个晚上。
Bessie想知道,它该如何选择每个晚上点燃哪些蜡烛,使得它的n根蜡烛能用尽量多的晚上。输出最多能用多少个晚上。
输入格式:
第一行:两个整数n,c,1 <= n,c<=1000000
第二行:n个整数,第i个整数表示第i根蜡烛的长度h[i]。1 <= h[i] <= 1000000
输出格式:
一个整数,总共最多能用多少个晚上
数据范围:
对于 30% 的数据, 1 <=n,c<=1000。
对于 100% 的数据, 1 <=n,c<=10^6。
样例输入:
3 3
2 2 2
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,c,h,m,y,l,r,zd=-1,x[1000009],s[1000009],t[1000009];
int main()
{
cin>>n>>c;
for(int i=1;i<=n;i++)
{
cin>>h;
zd=max(zd,h);
x[h]++;
}
for(int i=1000000;i>=1;i--)s[i]=s[i+1]+x[i];
for(int i=1;i<=1000000;i++)t[i]=t[i-1]+x[i]*i;
l=0,r=1e12+1;
for(;;)
{
m=(l+r)/2;
if(m>zd)y=t[zd]/m;
else y=s[m]+t[m-1]/m;
if(y>=c)l=m;
else r=m;
if(l+1==r)break;
}
cout<<l;
return 0;
}
二分法。