第九周 组队赛二130906

算法竞赛题解精选
本文精选了几道算法竞赛题目,并提供了详细的解题思路与代码实现,涵盖了字符串操作、数学规律发现、二进制转换及几何计算等多个方面。

A - Repeating Characters

简单题,把字符串里的每个字符连续输出k个即可

代码:

#include <iostream>//A  Hdu 4236 开始
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#define lson l,mid,num<<1
#define rson mid+1,r,num<<1|1
using namespace std;
const int M=100005;
int main()
{
    int t,a,n;
    char s[1001];
    scanf("%d",&t);
    while(t--)
    {
        memset(s,0,sizeof(s));
        scanf("%d%d%s",&a,&n,s);
        printf("%d ",a);
        int len=strlen(s);
        for(int i=0;i<len;i++)
        {
            for(int j=1;j<=n;j++)
            {
                printf("%c",s[i]);
            }
        }
        printf("\n");
    }
   return 0;
}

B - The Rascal Triangle

题意:R(n, m) = 0 for n < 0 OR m < 0 OR m > n

           R(n + 1, m + 1) = (R(n, m)*R(n, m + 1) + 1)/R(n - 1, m)

            R(n, 0) = R(n, n) = 1

给出这么个公式,求R(n,m)

刚开始受题中图的影响,怎么也推不出来,后面施神提示了一下,按原数组性质画出这个图,可以发现有这样的规律

1

1   1

1   2   1

1   3   3   1  

1   4    5  4   1

1   5   7    7   5   1

1   6   9   10  9    6    1

可以发现,第二列和倒数第二列都是成等差数列,且公差恰好为m,所以问题就转化成了求项数问题。。

仔细观察,发现问题恰好求第n-m项,则  s=1+m*(n-m)即为结果

代码:

#include <iostream>//B
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#define lson l,mid,num<<1
#define rson mid+1,r,num<<1|1
using namespace std;
const int M=10005;
int main()
{

    int t,a,n,m;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&a,&n,&m);
        printf("%d %I64d\n",a,(long long)m*(n-m)+1);
    }
   return 0;
}

D - Decoding EDSAC Data

题意:按题目要求把输入的数全部转换成二进制表示,然后求对应的十进制小数

这题题目很容易理解,但是就是转换的时候有点麻烦,组队赛过程中确实学到很多东西,那个尾部去0的方法是组队赛中学会的

代码:

#include <iostream>//H
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#define lson l,mid,num<<1
#define rson mid+1,r,num<<1|1
#define LL long long
using namespace std;
const int M=50005;
char a[]= {"PQWERTYUIOJ#SZK*?F@D!HNM&LXGABCV"};
map<char,string>tt;
string rev(int k,int num)
{
    string s="";
    int kk=0;
    while(k!=0)
    {
        int g=k%2;
        s+=g+'0';
        k/=2;
        kk++;
    }
    for(int i=1; i<=num-kk; i++)
        s+='0';
    reverse(s.begin(), s.end());
    return s;
}
void ff()
{
    for(int i=0; i<=31; i++)
    {
        string aa=rev(i,5);
        tt[a[i]]=aa;
        //cout<<tt[a[i]]<<endl;
    }
}
int main()
{
    ff();
    int t,a,n;
    char x,y;
    cin>>t;
    while(t--)
    {
        string s="";
        cin>>a;
        cin>>x>>n>>y;
        if(x=='?' && n==0 && y=='F')
        {
            printf("%d -1.0\n",a);
            continue;
        }
        s+=tt[x];
        s+=rev(n,11);
        if(y=='F')s+='0';
        else s+='1';
        //cout<<"s: "<<s<<endl;
        printf("%d ",a);
        if(s[0]=='1')
        {
            printf("-");
            int h;
            for(h=16; h>=1; h--)
            {
                if(s[h]=='1')break;
            }
            for(int j=h-1; j>=1; j--)
            {
                if(s[j]=='0')s[j]='1';
                else
                    s[j]='0';
            }
        }
        double sum=0.0;
        for(int i=16; i>=1; i--)//我想到跟求整数的二进制一样,就试试,没错!
        {
            sum=sum*0.5+s[i]-'0';
        }
        sum/=2;
        char ss[22];
        sprintf(ss,"%.16f",sum);
        int len=strlen(ss),i;
        //cout<<"ss: "<<ss<<endl;
        for(i=len-1; i>=0; i--)
        {
            if(ss[i]!='0')
            {
                if(ss[i]=='.')
                {
                    ss[i+2]='\0';
                    break;
                }
                else
                {
                    ss[i+1]='\0';
                    break;
                }
            }
        }
        cout<<ss<<endl;
    }
    return 0;
}

G - Rancher's Gift

题意:题意很简单,就是求四个三角形的面积和中间四边形的面积以及周长,注意单位的转换

其实蛮简单的,就是繁琐,把两直线的交点求出来,我可是弄了好久

代码:

#include <iostream>//G
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#define lson l,mid,num<<1
#define rson mid+1,r,num<<1|1
#define LL long long
using namespace std;
double gety(double xa,double ya,double x1,double y1,double xd,double yd,double x2,double y2)
{
    double s1=(yd-y1)*(ya-y2)*xd+(ya-y2)*(x1-xd)*yd+(y1-yd)*(ya-y2)*x2+(x2-xa)*(y1-yd)*y2;
    double s2=(xa-x2)*(yd-y1)+(x1-xd)*(ya-y2);
    return s1/s2;
}
double getx(double xa,double ya,double x2,double y2,double y)
{
    double s=xa+(((y-ya)*(x2-xa))/(y2-ya));
    return s;
}
double dis(double x1,double y1,double x2,double y2)
{
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double getarea(double a,double b,double c)
{
    double s=(a+b+c)/2;
    return sqrt(s*(s-a)*(s-b)*(s-c));
}
int main()
{
    int t,a;
    double x1,x2,x3,x4,y1,y2,y3,y4,s1,s2,s3,cc1,cc2,cc3,cc4;
    double xa,xb,xc,xd,ya,yb,yc,yd,sa,sb,sc,sd,se,sf;
    double xx1,xx2,xx3,xx4,yy1,yy2,yy3,yy4,c1,c2,c3,c4;
    scanf("%d",&t);
    while(t--)
    {
        xa=ya=yb=0;
        scanf("%d",&a);
        printf("%d",a);
        scanf("%lf %lf %lf %lf %lf",&xb,&xc,&yc,&xd,&yd);
        x1=(xa+xb)/2;
        y1=(ya+yb)/2;//ab

        x2=(xb+xc)/2;
        y2=(yb+yc)/2;//bc

        x3=(xc+xd)/2;
        y3=(yc+yd)/2;//cd

        x4=(xd+xa)/2;
        y4=(yd+ya)/2;//da

        yy1=gety(xa,ya,x1,y1,xd,yd,x2,y2);//1
        xx1=getx(xa,ya,x2,y2,yy1);

        yy2=gety(xb,yb,x2,y2,xa,ya,x3,y3);//2
        xx2=getx(xb,yb,x3,y3,yy2);

        yy3=gety(xc,yc,x3,y3,xb,yb,x4,y4);//3
        xx3=getx(xc,yc,x4,y4,yy3);

        yy4=gety(xd,yd,x4,y4,xc,yc,x1,y1);//4
        xx4=getx(xd,yd,x1,y1,yy4);

        //printf("%.3lf %.3lf\n%.3lf %.3lf\n",xx1,yy1,xx2,yy2);
       // printf("%.3lf %.3lf\n%.3lf %.3lf\n",xx3,yy3,xx4,yy4);

        s1=dis(xa,ya,xb,yb);
        s2=dis(xb,yb,xx2,yy2);
        s3=dis(xa,ya,xx2,yy2);
        sa=getarea(s1,s2,s3);

        s1=dis(xc,yc,xx3,yy3);
        s2=dis(xb,yb,xc,yc);
        s3=dis(xb,yb,xx3,yy3);
        sb=getarea(s1,s2,s3);

        s1=dis(xc,yc,xx4,yy4);
        s2=dis(xc,yc,xd,yd);
        s3=dis(xd,yd,xx4,yy4);
        sc=getarea(s1,s2,s3);

        s1=dis(xd,yd,xa,ya);
        s2=dis(xd,yd,xx1,yy1);
        s3=dis(xa,ya,xx1,yy1);
        sd=getarea(s1,s2,s3);

        cc1=dis(xx1,yy1,xx2,yy2);
        cc2=dis(xx2,yy2,xx3,yy3);
        cc3=dis(xx3,yy3,xx4,yy4);
        cc4=dis(xx4,yy4,xx1,yy1);
        double cc5=dis(xx1,yy1,xx3,yy3);
        sf=getarea(cc1,cc2,cc5)+getarea(cc3,cc4,cc5);
        se=cc1+cc2+cc3+cc4;
        printf(" %.3lf %.3lf %.3lf %.3lf %.3lf %.0lf\n",sa/160,sb/160,sc/160,sd/160,sf/160,ceil(se*16.5));
    }
    return 0;
}


Delphi 12.3 作为一款面向 Windows 平台的集成开发环境,由 Embarcadero Technologies 负责其持续演进。该环境以 Object Pascal 语言为核心,并依托 Visual Component Library(VCL)框架,广泛应用于各类桌面软件、数据库系统及企业级解决方案的开发。在此生态中,Excel4Delphi 作为一个重要的社区开源项目,致力于搭建 Delphi 与 Microsoft Excel 之间的高效桥梁,使开发者能够在自研程序中直接调用 Excel 的文档处理、工作表管理、单元格操作及宏执行等功能。 该项目以库文件与组件包的形式提供,开发者将其集成至 Delphi 工程后,即可通过封装良好的接口实现对 Excel 的编程控制。具体功能涵盖创建与编辑工作簿、格式化单元格、批量导入导出数据,乃至执行内置公式与宏指令等高级操作。这一机制显著降低了在财务分析、报表自动生成、数据整理等场景中实现 Excel 功能集成的技术门槛,使开发者无需深入掌握 COM 编程或 Excel 底层 API 即可完成复杂任务。 使用 Excel4Delphi 需具备基础的 Delphi 编程知识,并对 Excel 对象模型有一定理解。实践中需注意不同 Excel 版本间的兼容性,并严格遵循项目文档进行环境配置与依赖部署。此外,操作过程中应遵循文件访问的最佳实践,例如确保目标文件未被独占锁定,并实施完整的异常处理机制,以防数据损毁或程序意外中断。 该项目的持续维护依赖于 Delphi 开发者社区的集体贡献,通过定期更新以适配新版开发环境与 Office 套件,并修复已发现的问题。对于需要深度融合 Excel 功能的 Delphi 应用而言,Excel4Delphi 提供了经过充分测试的可靠代码基础,使开发团队能更专注于业务逻辑与用户体验的优化,从而提升整体开发效率与软件质量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
<think>好的,用户现在告诉我他是零基础,需要详细的准备计划来参加第九届集创飞腾杯。首先,我需要回顾之前的对话,我之前给他推荐了一个基于飞腾处理器的智能农业环境监测系统的题目,并且给出了实现路径、技术点、创新方向等。现在用户是零基础,可能需要更基础的指导,从学习路线到具体的时间安排。 首先,用户作为零基础,可能对嵌入式系统、传感器、编程语言等都不太了解。所以需要制定一个分阶段的学习计划,从基础知识开始,逐步深入。同时,他需要了解比相关的信息,比如比流程、评分标准,可能还需要组队建议。 接下来,我需要考虑如何将复杂的知识点分解成他能够逐步掌握的步骤。比如,第一阶段可能需要学习Linux基础、Python编程,以及基本的硬件操作。第二阶段则是具体的开发技能,如传感器使用、通信协议、数据可视化。第三阶段进入实战开发,第四阶段则是优化和文档准备。 然后,我需要确保每个阶段的时间安排合理,考虑到他是零基础,每个阶段可能需要足够的时间来消化知识,同时也要在比时间限制内完成。比如,总共有16,每个阶段大约4,但可能需要灵活调整。 还要注意推荐学习资源,尽量选择免费、中文、适合初学者的资源,比如菜鸟教程、B站视频、官方文档等。同时,硬件购买方面需要推荐具体的型号和购买渠道,避免用户被复杂的市场选择困扰。 另外,用户可能需要组队建议,作为零基础,他可能需要寻找有不同技能的队友,比如硬件、软件、文档等分工。这里需要提醒他尽早组队,明确分工,定期沟通。 还要考虑可能的痛点,比如硬件采购的时间,开发中的调试问题,代码版本管理,以及文档的重要性。需要给出具体的建议,比如使用GitHub进行版本控制,使用模块化开发减少错误影响,准备备用方案等。 最后,鼓励用户保持实践和记录,参加比不仅仅是技术,展示和沟通也很重要。需要提醒他注意比时间节点,提前准备演示材料,进行模拟答辩。 总结来说,我需要提供一个结构清晰、分阶段、详细到每任务的计划,涵盖学习内容、实践项目、资源推荐、组队建议和注意事项,帮助用户从零开始逐步备,同时保持可行性和鼓励持续学习。</think>以下是为零基础参者定制的**4个月详细备计划**,包含技术学习路径、资源推荐和时间管理方案: --- ### **一、基础准备阶段(第1-4)** ```mermaid gantt title 基础学习阶段 dateFormat YYYY-MM-DD section 核心基础 Linux基础 :a1, 2023-10-01, 7d Python编程 :a2, after a1, 14d section 硬件认知 电子元件识别 :a3, 2023-10-08, 7d 开发板基础操作 :a4, after a3, 14d section 比认知 往届作品分析 :a5, 2023-10-15, 7d 技术文档规范学习 :a6, after a5, 7d ``` **每日学习安排(建议3小时)**: - **上午**(1.5小时): - 学习Linux基础命令(`cd/ls/cp/mkdir`等) - 完成Python语法练习(变量/条件判断/循环) - **下午**(1小时): - 认识电阻/电容等基础元件 - 练习使用万用表测量电路 - **晚上**(0.5小时): - 观看往届获奖作品演示视频 **关键里程碑**: - 第7天:成功点亮开发板LED - 第14天:完成第一个Python数据采集程序(模拟数据) - 第21天:制作电路认知速查表 --- ### **二、技能构建阶段(第5-8)** **核心学习内容**: 1. **传感器技术**: - 掌握I2C/SPI通信协议 - 完成DHT11温湿度传感器数据采集 - 实践数据校准(制作温度对照表) 2. **嵌入式开发**: - 学习交叉编译环境搭建 - 完成GPIO控制实验 - 编写第一个设备驱动程序 3. **通信协议**: - 实现WiFi模块配网 - 完成MQTT协议数据传输 - 搭建本地服务器测试环境 **推荐实践项目**: - 制作温湿度监测器(本地显示) - 开发简易物联网开关(手机控制LED) - 搭建数据看板(显示历史曲线) --- ### **三、系统开发阶段(第9-12)** **开发流程分解**: 1. **硬件搭建**(3天): ```python # 示例:传感器数据读取伪代码 import Adafruit_DHT sensor = Adafruit_DHT.DHT11 pin = 4 # GPIO4 humidity, temperature = Adafruit_DHT.read_retry(sensor, pin) ``` 2. **数据传输**(5天): - 使用`paho-mqtt`库实现云端传输 - 设计JSON数据格式: ```json { "device_id": "FT-001", "timestamp": "2023-10-01T14:30:00", "temperature": 25.6, "humidity": 60.2 } ``` 3. **可视化开发**(7天): - 使用Flask搭建Web服务 - 集成ECharts实现动态图表 - 添加阈值报警功能 --- ### **四、优化冲刺阶段(第13-16)** **重点优化方向**: 1. **性能提升**: - 降低CPU占用率(优化`while`循环) - 减少内存泄漏(使用`valgrind`检测) 2. **稳定性增强**: - 添加看门狗程序 - 实现断网自动重连 - 设计电源管理策略 3. **展示准备**: - 制作系统架构图(推荐使用Draw.io) - 录制演示视频(重点展示数据流) - 准备答辩Q&A清单 --- ### **零基础学习资源包** | 类别 | 推荐资源 | |--------------|--------------------------------------------------------------------------| | 编程基础 | 菜鸟教程Python模块、廖雪峰Python3教程 | | 硬件知识 | 《电子设计从零开始》(清华大学出版社)、EEVblog视频教程 | | 嵌入式开发 | 飞腾官方文档、野火嵌入式Linux教程 | | 比指导 | 集创官网往届优秀作品、全国大学生电子设计竞案例解析 | --- ### **硬件采购清单(预算<800元)** 1. 飞腾派开发板(建议购买官方套件) 2. DHT11+BH1750传感器套装(淘宝约30元) 3. WiFi模块(ESP8266约15元) 4. 电源管理模块(TP4056充电板约5元) 5. 外壳定制(3D打印服务约100元) --- ### **常见问题应对策略** 1. **硬件调试失败**: - 检查供电电压是否稳定(建议使用示波器) - 确认GPIO引脚映射是否正确 - 添加`try-except`异常捕获机制 2. **数据波动异常**: - 增加滑动平均滤波算法 ```python def moving_average(data, window_size=5): return [sum(data[i:i+window_size])/window_size for i in range(len(data)-window_size+1)] ``` 3. **界面卡顿**: - 采用WebSocket替代轮询请求 - 使用前端虚拟滚动技术(针对大数据量) --- ### **组队与时间管理建议** 1. **团队组建**: - 推荐3人分工: - 硬件工程师(负责电路设计) - 软件工程师(负责嵌入式开发) - 全栈工程师(负责前后端开发) 2. **进度把控**: - 使用GitHub进行版本管理 - 每日召开站立会议(同步开发进展) - 预留2缓冲时间应对突发状况 3. **效率提升技巧**: - 使用PlatformIO代替原生开发环境 - 采用模块化开发(每个功能独立测试) - 建立代码片段库(常用函数封装) --- **特别提示**:建议每天保留1小时进行**实物操作记录**(拍照/视频/文字),这对最终答辩展示和文档撰写至关重要。遇到技术问题可优先参考飞腾开发者社区(forum.phytium.com.cn)的案例库。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值