题目:
分析思考:
一开始我还读不懂题目,哈哈感觉自己要完了。
因为放在双指针那里,还以为要用双指针去想,后来稍微看了一眼题解的标题二分也行,想一想也是如此哦!!!
易错点:
1.》=的关系,刚开始还不理解。
2.不用对每篇引用次数做一次排序,因为是对篇数作二分,而不是对引用次数做二分
难点:
1.在于奶牛博士的·引用的沦为篇章数目L要如何处理。
具体是加到比mid小1的引用次数上!!!这样想的原因是,这样才有可能说h变大
2.具体是怎么算最后的h,不用算的。就是二分来找看合不合适。
合不合适才需要算!!!
3.如何判断合不合适:
bool check(int mid)
{
int acount=0,b=0; //a和b要置成内置变量,每次清零,才不影响结果
for(int i=1;i<=n;i++)
{
if(a[i]>=mid) acount++;
else if(a[i]==mid-1) b++; //注意:对于处理那个L加在哪一个数上
}
if(acount + min(b, L) >= mid)
return true;
else
return false;
}
我是这样判断的:(这个可能不太好想)
假如已经计算好了b=2
①.假如b>L,那么L是分配不到每个b上面的,所以要min(a,b);
②.假如b<L,那么L能充分分配到b上面,具体怎么分最优不需要我们去弄,当然,最基本肯定是L肯定要给b的两篇文章分一篇,剩下的L随便分
语法错误:(写代码过程中)
1.数组和变量名重名导致 [Error] invalid types 'int[int]' for array subscript
过数据点:
我有个数据点
一直过不了,会导致数据根本进入不了二分循环,这是选择哪一个二分模板的关键!!!
在这道题就比较特别,常用的就是左闭右开(l<r)的方式,但是这里是不行的。
代码:
//acwing 3745
// [Error] invalid types 'int[int]' for array subscript
//数组和变量名重名
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=100010;
int n,L;
int a[N];
bool check(int mid)
{
int acount=0,b=0; //a和b要置成内置变量,每次清零,才不影响结果
for(int i=1;i<=n;i++)
{
if(a[i]>=mid) acount++;
else if(a[i]==mid-1) b++; //注意:对于处理那个L加在哪一个数上
}
if(acount + min(b, L) >= mid)
return true;
else
return false;
}
int main()
{
scanf("%d%d",&n,&L) ;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int l=1,r=n,mid;
while(l<=r)
{
mid=l+(r-l)/2;
if(check(mid)) l=mid+1;
else r=mid-1;
}
printf("%d",l-1);
return 0;
}
!!!提个醒:这题可以用双指针(但我学识尚浅觉得有点难理解暂时还写不出来)