GDUT_寒假训练题解报告_专题I_I题 个人题解报告

本篇题解报告详细介绍了GDUT寒假训练中的一个题目,采用二分查找结合贪心算法解决间距最大化问题。讨论了二分查找的意义定义、check函数的实现思路,以及在取mid时的注意事项,避免int溢出风险,确保left和right的正确偏移。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GDUT_寒假训练题解报告_专题I_I题 个人题解报告

第二天,比第一天艰难多了,到了晚上十点,才A一道题目,半桶水数据结构半桶水结构体现学现卖学bfs还没A,Orz。

这个题目思路:

1、这题不说是二分我也不知道是二分,这个二分最终是对ans进行二分,那么定意义:mid是sort好的序列中,找一个序列使最小间距≥mid
2.既然如此就要写一个check,思路是贪心,直接取就好了。
3.对于这个题目,要千万注意取mid,做个笔记:

1 mid=left+(right-left)/2要比mid=(right+left)/2要好,具体因为right+left会有爆int的风险;
2 mid=left+(right-left+1)/2偏右,对应的是left和right一定要偏向左,而不能偏右,相反也是。否则出现3 4变成2 4或者3 5的鬼畜情况

上代码

我注释掉的,都是一些鬼畜错误的xjb补救,这才是我的真实水平):

//  code block
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <climits>
#include <queue>
#define ULL unsigned long long
using namespace std;
bool check(int k);
int all[100010];
int N,C;
//int ans_MIN;
int main()
{
	scanf("%d %d",&N,&C);
	for(int time=0;time<N;time++)
	{
		scanf("%d",&all[time]);
	}
	sort(all,all+N);
	int left=0,right=all[N-1]-all[0]+1;
	//ans_MIN=left;
	while(left+1<right)
	{
		/*
		if(right-left==1)
		{
			if(check(left))ans_MIN=left;
			if(check(right))ans_MIN=right;
		}
		*/
		int mid=(right+left)/2;
		if(check(mid))
		{
			//ans_MIN=mid;
			left=mid;
		}
		else right=mid;
	}
	printf("%d\n",left);


    return 0;
}
bool check(int k)
{
	int num=C-1;
	int location=0;
	int last=0;
	while(++location)
	{
		if(num==0)return 1;
		else if(location==N)return 0;
		else if(all[location]-all[last]>=k){last=location;num--;}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值