- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
解题思路
我们考虑总共需要的花朵数,假设答案为?x,那么我们需要的花朵是则为?x×k?朵。对于第?i位追求者送的花我们思考他能为答案提供多少有效的花朵,显然是min(ai,x)?。这样我们就可以统计出每个人可提供的有效花朵的和是否达到了?x×k,如果达到则说明我们可以凑出?x?束花束,否则则不行。当然我们不能去枚举?x,不难发现?x是具有二段性质的,当能凑出?x?束则说明一定能凑出?x?1?束,所以我们可以二分答案。
需要注意二分的上界不要开小,判断?res≥x×k?时,?x×k?可能会爆?longlong?,可以写成res/x≥k?。
时间复杂度:O(nlog214)?。
AC_Code
C++
#includebits/stdc++.h
usingnamespacestd;
typedeflonglongLL;
typedefunsignedlonglonguLL;
typedefpairint,intPII;
#definepb(s)push_back(s)
#definesz(s)((int)s.size())
#definexfirst
#defineysecond
#definems(s,x)memset(s,x,sizeof(s))
#defineall(s)s.begin(),s.end()
constintinf=0x3f3f3f3f;
constintmod=1000000007;
constintN=200010;
intn,k;
voidsolve()
{
cinnk;
std::vectorLLa(n);
for(inti=0;in;++i)cina[i];
autocheck=[](LLx){
LLres=0;
for(inti=0;in;++i){
res+=min(a[i],x);
}
returnres/x=k;
};
LLl=0,r=2e14;
while(lr){
LLmid=l+r+11;
if(check(mid))l=mid;
elser=mid-1;
}
coutr\n;
}
intmain()
{
ios_base::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
coutsetiosflags(ios::fixed)setprecision(2);
intt=1;
while(t--)
{
solve();
}
return0;
}
Java
importjava.util.*;
publicclassMain{
staticfinalintinf=0x3f3f3f3f;
staticfinalintmod=1000000007;
staticfinalintN=200010;
staticintn,k;
publicstaticvoidmain(String[]args){
Scannersc=newScanner(System.in);
intt=1;
while(t--0){
n=sc.nextInt();
k=sc.nextInt();
ArrayListLonga=newArrayList();
for(inti=0;in;++i){
a.add(sc.nextLong());
}
longl=0,r=2*(long)1e14;
while(lr){
longmid=(l+r+1)/2;
if(check(mid,a)){
l=mid;
文档评论(0)