acwing3745 牛的学术圈I(二分法)

题目:

分析思考:

一开始我还读不懂题目,哈哈感觉自己要完了。

因为放在双指针那里,还以为要用双指针去想,后来稍微看了一眼题解的标题二分也行,想一想也是如此哦!!!

易错点:

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;
}

!!!提个醒:这题可以用双指针(但我学识尚浅觉得有点难理解暂时还写不出来)

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值