二分+分治plus

本文解析了洛谷上的三道编程题:跳石头、数列分段与逆序对。通过详细阐述每道题目的核心算法思想,如二分查找、前缀和及归并排序等,帮助读者理解如何高效解决这些问题。

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

洛谷p2678跳石头

终于过了,复杂度(nlogn)看来还是可以接受的。判断是否成立部分也不难。

顺便过了p1316丢瓶盖,两题挺像的。

#include<bits/stdc++.h>
using namespace std;
int a[50010]={0};
int len,n,m,l,r,mid; 
bool check(int temp)//判断是否成立
{
    int s=0,flag=0;
    for(int i=1;i<=n;i++)
    {
	if(a[i]-a[flag]>=temp)flag=i;
	else s++;
    }
    if(flag!=n)s++;
    if(s<=m)return true;else return false;
}

int main()
{
    scanf("%d%d%d",&len,&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    a[++n]=len;l=1;r=len;
    while(l+1<r)//二分答案
    {
	mid=(l+r)/2;
	if(check(mid))l=mid;else r=mid;
    }
    if(check(r))printf("%d",r);else printf("%d",l);
    return 0;
}
洛谷p1181数列分段

用到前缀和,刚开始没有注意到flag的包含问题,改了后就过了。。。打表大法好,模拟大法好

#include<bits/stdc++.h>
using namespace std;
int a[100010]={0},sum[100010]={0};
int n,m,l,r,mid,ma; 
bool check(int temp)
{
        int s=0,flag=1;
	for(int i=1;i<=n;i++)
	if(sum[i]-sum[flag-1]>temp)//[flag-1]!
	{
	    flag=i;
		s++;
	}
	if(s<m)return true;
	else return false;
}

int main()
{
	scanf("%d%d",&n,&m);
	ma=0;
	for(int i=1;i<=n;i++)
	{
	    scanf("%d",&a[i]);
	    sum[i]=sum[i-1]+a[i];
	    if(a[i]>ma)ma=a[i];
	}
	l=ma;r=sum[n];
	while(l+1<r)
	{
		mid=(l+r)/2;
		if(check(mid))r=mid;
		else l=mid;
	}
	if(check(l))printf("%d",l);
	else printf("%d",r);
	return 0;
}
p1908逆序对

经典模版题(现在才ak真是惭愧。。。)归并排序其实也不难理解(只是以前太害怕?)

明天计划:聪明的质检员,试练场“递推与递归二分”。

#include<bits/stdc++.h>
using namespace std;
int a[40010]={0},c[40010]={0},n;
long long ans=0;
void swap(int l,int r)
{
	if(l==r)return;
	int mid=(l+r)/2;
	swap(l,mid);swap(mid+1,r);//拆分
	int i=l,j=mid+1,x=l;
	while(i<=mid&&j<=r)//合并
	if(a[i]<=a[j])
	{
		c[x]=a[i];i++;x++;
	}
	else
	{
		c[x]=a[j];x++;j++;
		ans+=mid-i+1;//计数逆序对
	}
	while(i<=mid)
	{
		c[x]=a[i];x++;i++;
	}
	while(j<=r)
	{
		c[x]=a[j];x++;j++;
	}
	for(int i=l;i<=r;i++)a[i]=c[i];//整理
	return;
}
		

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	swap(1,n);
	printf("%lld",ans);
	return 0;
}
内容概要:本文介绍了奕斯伟科技集团基于RISC-V架构开发的EAM2011芯片及其应用研究。EAM2011款高性能实时控制芯片,支持160MHz主频和AI算法,符合汽车电子AEC-Q100 Grade 2和ASIL-B安全标准。文章详细描述了芯片的关键特性、配套软件开发套件(SDK)和集成开发环境(IDE),以及基于该芯片的ESWINEBP3901开发板的硬件资源和接口配置。文中提供了详细的代码示例,涵盖时钟配置、GPIO控制、ADC采样、CAN通信、PWM输出及RTOS任务创建等功能实。此外,还介绍了硬件申领流程、技术资料获取渠道及开发建议,帮助开发者高效启动基于EAM2011芯片的开发工作。 适合人群:具备嵌入式系统开发经验的研发人员,特别是对RISC-V架构感兴趣的工程师和技术爱好者。 使用场景及目标:①了解EAM2011芯片的特性和应用场景,如智能汽车、智能家居和工业控制;②掌握基于EAM2011芯片的开发板和芯片的硬件资源和接口配置;③学习如何实基本的外设驱动,如GPIO、ADC、CAN、PWM等;④通过RTOS任务创建示例,理解多任务处理和实时系统的实。 其他说明:开发者可以根据实际需求扩展这些基础功能。建议优先掌握《EAM2011参考手册》中的关键外设寄存器配置方法,这对底层驱动开发至关重要。同时,注意硬件申领的时效性和替代方案,确保开发工作的顺利进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值