2017.07.20

https://vjudge.net/contest/172194#problem/I

这题很绝望。。。一直做不出来。。
看了别人的代码后发现自己好傻逼。。

https://vjudge.net/contest/172194#problem/B
虽然知道是贪心,但是不知道为什么总是没写对。。
看来我的代码不够优雅。。。
看了大佬的,,真好。 而且更多的思考。就是不用判断是
lower_bound(+1) 因为如果最小的很不是最大的都可以》s了
那么最大的一定是运一次 。。

**
    int l=0,r=n+1;//看别人,这种写法比较优雅?
    int tol=0,cnt=0;
    while(l+1!=r){
        if(l+2==r){
            ans[++cnt]=a[l+1];
            tol++;
            break;
        }
        if(a[l+1]+a[r-1]>k){
            ans[++cnt]=a[++l];
            ans[++cnt]=a[--r];
            tol+=2;
        }else{
            ans[++cnt]=a[++l];
            ans[++cnt]=a[++l];
            tol++;
        }
    }**

https://vjudge.net/contest/172313#problem/A

km算法的模板题,不过还是要看别人的算法实现。。


int w[maxn][maxn];
int x[maxn],y[maxn],S[maxn],T[maxn];
int pre[maxn];
int slack;
int n;
bool find(int id){
    S[id]=true;
    for(int i=1;i<=n;++i){
        if(x[id]+y[i]==w[id][i]&&!T[i]){
            T[i]=true;
            if(pre[i]==-1||find(pre[i])){
                pre[i]=id;
                return true;
            }
        }else if(x[id]+y[i]>w[id][i]){
            slack=min(slack,x[id]+y[i]-w[id][i]);
        }
    }
    return false;
}
void update(){
    for(int i=1;i<=n;++i){
        if(S[i])x[i]-=slack;
        if(T[i])y[i]+=slack;
    }
}
void km(){
    for(int i=1;i<=n;++i){
        x[i]=y[i]=0;pre[i]=-1;
        for(int j=1;j<=n;++j){
            x[i]=max(x[i],w[i][j]);
        }
    }
    for(int i=1;i<=n;++i){
        while(1){
            for(int j=1;j<=n;++j)S[j]=T[j]=false;
            slack=INF;
            if(find(i))break;
            else update();
        }
    }
    int ans=0;
    for(int i=1;i<=n;++i){
        ans+=x[i]+y[i];
    }
    pf("%d\n",ans);
}

https://vjudge.net/contest/171669#problem/F
这题还是看了键哥给我的题解才知道的。。。
这里存约数
这里写图片描述

/** * @par Copyright (C): 2010-2019, Shenzhen Yahboom Tech * @file bsp_linewalking.c * @author liusen * @version V1.0 * @date 2017.07.17 * @brief ѲÏßÇý¶¯Ô´Îļþ * @details * @par History ¼ûÈçÏÂ˵Ã÷ * * version: liusen_20170717 */ #include "bsp_linewalking.h" #include "stm32f10x.h" /** * Function bsp_GetLineWalking * @author liusen * @date 2017.07.20 * @brief »ñȡѲÏß״̬ * @param[in] int *p_iL1, int *p_iL2, int *p_iR1, int *p_iR2 ¸³ÖµÖ¸Õë¶ÔÓ¦µØÖ·µÄ״ֵ̬ * @param[out] Ö¸ÕëÖµ * @return void * @par History ÎÞ */ void bsp_GetLineWalking(int *p_iL1, int *p_iL2, int *p_iR1, int *p_iR2) { *p_iL1 = GPIO_ReadInputDataBit(LineWalk_L1_PORT, LineWalk_L1_PIN); *p_iL2 = GPIO_ReadInputDataBit(LineWalk_L2_PORT, LineWalk_L2_PIN); *p_iR1 = GPIO_ReadInputDataBit(LineWalk_R1_PORT, LineWalk_R1_PIN); *p_iR2 = GPIO_ReadInputDataBit(LineWalk_R2_PORT, LineWalk_R2_PIN); } /** * Function bsp_GetLineWalking_Data * @author liusen * @date 2017.07.20 * @brief »ñȡѲÏß״̬intÉϱ¨Ê±µ÷Óà * @param[in] void * @param[out] void * @return 1011,Éϱ¨Óà * @par History ÎÞ */ int bsp_GetLineWalking_Data(void) { int iL1, iL2, iR1, iR2, returnValue; iL1 = GPIO_ReadInputDataBit(LineWalk_L1_PORT, LineWalk_L1_PIN); iL2 = GPIO_ReadInputDataBit(LineWalk_L2_PORT, LineWalk_L2_PIN); iR1 = GPIO_ReadInputDataBit(LineWalk_R1_PORT, LineWalk_R1_PIN); iR2 = GPIO_ReadInputDataBit(LineWalk_R2_PORT, LineWalk_R2_PIN); returnValue = (iL1 == 1?0:1000); returnValue += (iL2 == 1?0:100); returnValue += (iR1 == 1?0:10); returnValue += (iR2 == 1?0:1); return returnValue; } /** * @par Copyright (C): 2010-2019, Shenzhen Yahboom Tech * @file app_linewalking.c * @author liusen * @version V1.0 * @date 2017.07.17 * @brief ѲÏßģʽÔ˶¯ * @details * @par History ¼ûÈçÏÂ˵Ã÷ * * version: liusen_20170717 */ #include "app_linewalking.h" #include "bsp_linewalking.h" #include "sys.h" #include "app_motor.h" #include "delay.h" #include <stdio.h> /** * Function app_LineWalking * @author liusen * @date 2017.07.20 * @brief ѲÏßģʽÔ˶¯ * @param[in] void * @param[out] void * @retval void * @par History ÎÞ */ void app_LineWalking(void) { int LineL1 = 1, LineL2 = 1, LineR1 = 1, LineR2 = 1; bsp_GetLineWalking(&LineL1, &LineL2, &LineR1, &LineR2); if(LineL2 == 0 && LineR1 ==1 ) //С³µÔ˶¯²¢·¢ËÍÊý¾Ýµ½ÉÏλ»ú { Car_Right(50); } else if(LineL2 == 1 && LineR1 ==0 ) //С³µÔ˶¯²¢·¢ËÍÊý¾Ýµ½ÉÏλ»ú { Car_Left(20); } else if(LineL2==1&&LineR1==1){ Car_Run(50); } else if(LineL2==0&&LineR1==0){ Car_Stop(); } } // if(LineL2 == 0 && LineR1 == 1) // { // Car_TurnRight(50); // UpData_Send(LineL1, LineL2, LineR1, LineR2); // }
最新发布
07-15
### 传感器读取逻辑 在基于 STM32 的巡线小车中,传感器的读取通常涉及对红外或灰度传感器输出信号的处理。以红外传感器为例,当检测到黑线时返回值为 0,而检测到亮光区域时返回值为 1 [^2]。这种离散的二进制信号可以通过配置 GPIO 引脚为输入模式来读取。例如,在 STM32F103C8T6 上,可以使用 `PAin(1)` 和 `PAin(2)` 来获取两个红外传感器的状态: ```c #define DO1 PAin(1) #define DO2 PAin(2) void REDRAY_Scan(void) { if(DO1 == 0) redray1_findblack = 1; else redray1_findblack = 0; if(DO2 == 0) redray2_findblack = 1; else redray2_findblack = 0; } ``` 对于灰度传感器,其输出可能是模拟信号,这就需要利用 ADC(模数转换)功能将模拟信号转化为数字量进行比较 [^3]。通过设定一个阈值,可以判断是否处于黑线上。这种方式虽然增加了 MCU 的负担,但提供了更精细的位置反馈。 ### 电机控制逻辑 电机控制通常依赖于 PWM(脉宽调制)技术来调节速度,并通过 H 桥驱动器如 L298N 控制方向 [^2]。L298N 的 IN1、IN2 接口连接至 STM32 的 IO 口用于控制左侧电机的方向,而 IN3、IN4 则用于右侧电机。ENA 和 ENB 是使能端,分别连接到 STM32 的 PWM 输出通道,用来调整电机的速度。 以下是一个简化的 PWM 初始化示例代码片段,展示如何设置定时器以生成 PWM 波形: ```c // 假设 TIM3_CH1 和 TIM3_CH2 被用作 PWM 输出 void PWM_Init(void) { // 配置GPIO和TIM3... TIM_OCInitTypeDef TIM_OCStruct; TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OCStruct.TIM_Pulse = 0; // 初始占空比设为0% TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_High; // 对于CH1 TIM_OC1Init(TIM3, &TIM_OCStruct); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); // 对于CH2 TIM_OC2Init(TIM3, &TIM_OCStruct); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE); TIM_Cmd(TIM3, ENABLE); // 启动定时器 } // 设置PWM占空比 void Set_PWM_DutyCycle(uint16_t channel, uint16_t duty) { switch(channel) { case 1: TIM_SetCompare1(TIM3, duty); break; case 2: TIM_SetCompare2(TIM3, duty); break; // 其他通道可添加 } } ``` ### 巡线控制策略 巡线控制的核心在于根据传感器数据调整小车的方向。一种简单的比例控制方法可以根据偏离程度成比例地改变左右轮速差。比如,如果左传感器离开黑线,则增加右轮速度或减少左轮速度;反之亦然。这可以通过计算偏移量并据此调整 PWM 占空比实现。 假设有一个偏移量变量 `offset`,它反映了当前路径与理想位置之间的偏差,那么可以这样调整速度: ```c int base_speed = 500; // 基础速度值 int correction = Kp * offset; // Kp 为比例系数 Set_PWM_DutyCycle(LEFT_MOTOR_CHANNEL, base_speed - correction); Set_PWM_DutyCycle(RIGHT_MOTOR_CHANNEL, base_speed + correction); ``` 这里 `Kp` 是控制器增益,需经过实验确定最佳值。此方法简单有效,但在复杂轨迹上可能不够稳定,此时可以考虑引入 PID 控制算法提高精度与响应性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值