没有康过题目的小伙伴可以先看下。 题目传送门
首先,这题是道二分查找,所以先写二分,左端点和右端点都是来找出最小嫉妒值。
while(l<r){
int mid=(l+r)/2;
//cout<<endl<<mid;
//cout<<endl<<enough_(mid)<<endl;
if(enough_(mid)==1)r=mid;
else l=mid+1;
}
然后就是enough_函数了。
bool enough_(int x){
int ans=0;
for(int i=1;i<=m;i++)ans+=(c[i]-1)/x+1;
if(ans<=n)return 1;
else return 0;
}
之后就是愉快的补全代码环节了,但是在此之前,我们需要找到最开始的left和right,left至少是1,right则是其中一种颜色最多的(应为最大的x)。
r=-1;
l=1;
for(int i=1;i<=m;i++)
if(c[i]>r)r=c[i];
最后献上完整代码:
#include<bits/stdc++.h>
using namespace std;
int m,n,c[300001]={0},l,r;
bool enough_(int x){
int ans=0;
for(int i=1;i<=m;i++)ans+=(c[i]-1)/x+1;
if(ans<=n)return 1;
else return 0;
}
int main(){
r=-1;
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>c[i];
l=1;
for(int i=1;i<=m;i++)
if(c[i]>r)r=c[i];
while(l<r){
int mid=(l+r)/2;
if(enough_(mid)==1)r=mid;
else l=mid+1;
}
cout<<r;
return 0;
}