蓝桥杯真题训练 五一 3/5

本文介绍了一种使用树状数组求解逆序对数量的方法,并通过两个具体实例进行了解释。首先详细阐述了树状数组的基本概念及其实现方式,接着给出了具体的代码实现过程。最后还提供了一个简单的移动距离计算问题的解决方案。

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

1215 小朋友排队

题目被喂了一下,知道是求逆序对的题目,一开始也想到了排序,看题解有人用归并排序做。树状数组以前学过,忘记了,看了一手代码,又会了。
二进制表示下最低位1及其后面的0构成的数值:lowbit(x) —> x & -x —> x & (~x+1) 取反加一。
有些地方都写在注释里了。那再说一下思路:
为什么做两遍树状数组,因为一个数的逆序对数,就是在它之前比它大的数,加上在它之后比它小的数。有了这个关系我们可以知道,一遍是为了求比在i之前,比当前(第i个)数大的数;一遍是为了求在i之后,比当前数小的数。所以才有了第一遍1~ n,第二遍n~ 1。
树状数组的概念就不赘述了,就是每隔2^i次计算一下前面数的和,比前缀和高级(快),跳着加,因为有lowbit这个特性。但是区间求和的时候如果左右边界不是2的倍数,还是要慢慢找一会儿,比遍历要快。(l,r)— l>=2 ^ i — r<=2 ^ i+j 就在这个(i~i+1)和(i+j-1,i+j)的区间里把累加和找出来就成,其它的区间和可以直接相减获得,和前缀和找区间和做法相同。(和这题没关系)
求出逆序对后,根据题意,每个小朋友有多少个逆序对,就交换了几次顺序,那不满意值根据逆序对个数n算一个等差数列的前n项和,再把每个小朋友的不满意值累加即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+100;
int n;
ll a[maxn];
ll tree[maxn];
ll b[maxn];//逆序对数
int lowbit(int x){
    return x&-x;
}
void add(int x,int y){
    for(int i=x;i<maxn;i+=lowbit(i)) tree[i]+=y;
}
int query(int x){
    int ans=0;
    for(int i=x;i;i-=lowbit(i)) ans+=tree[i];
    return ans;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        a[i]++;
    }
    for(int i=1;i<=n;i++){
        //i 表示当前插入了几个数
        add(a[i],1);// 每个数插入的权值为1
        b[i]=i-query(a[i]);//在i之前 有多少个比i大的数被插入
    }
    memset(tree,0,sizeof(tree));//再做一遍 树状数组
    for(int i=n;i>=1;i--){
        add(a[i],1);
        b[i]+=query(a[i]-1);//在i i+1~n 有多少个数比i小 
    }
    ll res=0;
    for(int i=1;i<=n;i++){
        res+=(1+b[i])*b[i]/2;//等差数列求前n项和公式
    }
    cout<<res;
    //system("pause");
    return 0;
}

1219 移动距离

#include<bits/stdc++.h>
using namespace std;
int w,m,n;
int main(){
    cin>>w>>m>>n;
    int x,y,xx,yy;
    m--;
    n--;
    x=m/w;
    y=m%w;
    xx=n/w;
    yy=n%w;
    if(x%2==1) y=(w-y-1)%w;
    if(xx%2==1) yy=(w-yy-1)%w;
    cout<<abs(x-xx)+abs(y-yy);
    //system("pause");
    return 0;
}
内容概要:本文详细介绍了基于FPGA的144输出通道可切换电压源系统的设计与实现,涵盖系统总体架构、FPGA硬件设计、上位机软件设计以及系统集成方案。系统由上位机控制软件(PC端)、FPGA控制核心和高压输出模块(144通道)三部分组成。FPGA硬件设计部分详细描述了Verilog代码实现,包括PWM生成模块、UART通信模块和温度监控模块。硬件设计说明中提及了FPGA选型、PWM生成方式、通信接口、高压输出模块和保护电路的设计要点。上位机软件采用Python编写,实现了设备连接、命令发送、序列控制等功能,并提供了一个图形用户界面(GUI)用于方便的操作和配置。 适合人群:具备一定硬件设计和编程基础的电子工程师、FPGA开发者及科研人员。 使用场景及目标:①适用于需要精确控制多通道电压输出的实验环境或工业应用场景;②帮助用户理解和掌握FPGA在复杂控制系统中的应用,包括PWM控制、UART通信及多通道信号处理;③为研究人员提供一个可扩展的平台,用于测试和验证不同的电压源控制算法和策略。 阅读建议:由于涉及硬件和软件两方面的内容,建议读者先熟悉FPGA基础知识和Verilog语言,同时具备一定的Python编程经验。在阅读过程中,应结合硬件电路图和代码注释,逐步理解系统的各个组成部分及其相互关系。此外,实际动手搭建和调试该系统将有助于加深对整个设计的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值