今天依旧是二分,但这道题可以用双指针,明天研究一下,今天满课四节课三节水课,一节专业课还是念PPT!
ACWING 3745. 牛的学术圈 I
本题可以用二分解决,但需要注意,对论文引用次数为h-1且个数符合小于等于L的也符合条件
可以二分引用次数区间0-1e5或者二分h指数,以下是两种方法
二分h指数法,需要额外挖掘一个条件
首先论文个数为N,则该组数据最大h指数一定不超过输入论文篇数也就是N
所以对应以下两种方法
二分h指数
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+7;
int a[N],n,L;
bool check(int mid){
int num1=0,num2=0;
for(int i=0;i<n;i++)
if(a[i]>=mid) num1++;
else if(a[i]+1>=mid) num2++;
num2=min(num2,L);
return num1+num2>=mid;
}
int main(){
cin>>n>>L;
for(int i=0;i<n;i++) cin>>a[i];
int l=0,r=n;
while(l<r){
int mid=l+r+1>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
cout<<l;
return 0;
}
二分引用次数区间
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+7;
int a[N],n,L;
bool check(int mid){
int num=0,y=L;
for(int i=1;i<=n;i++)
if(a[i]>=mid) num++;
else if(y&&a[i]+1>=mid) num++,y--;
return num>=mid;
}
int main(){
cin>>n>>L;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a,a+n);
int l=0,r=1e5;
while(l<r){
int mid=l+r+1>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
cout<<l;
return 0;
}
今天满课,发现水课对我没啥用,还不如码博客,以后上水课开摆!