HNU-算法设计与分析-作业1

news2024/9/9 4:45:59

算法设计与分析

计科210X 甘晴void 202108010XXX
在这里插入图片描述

前言

这个系列本来想只用一个博客搞定的,谁曾想CSDN对于大批量文字的在线编辑一塌糊涂,感觉走倒车了。只能分成几个博客分别来讲了。后续会有作业-23456。作业重要的是搞懂原因。

文章目录

  • 算法设计与分析
    • 前言
    • 第一次作业
      • <1> 算法分析题1-6
      • <2> 算法实现题1-1 统计数字问题
      • <3> 算法实现题1-2 字典序问题

第一次作业

<1> 算法分析题1-6

(1)

f(n)G(n)answer备注
f(n)=log(n^2)g(n)=logn+5f(n)=θ(g(n))同阶
f(n)=log(n^2)g(n)=sqrt(n)f(n)=O(g(n))sqrt(n)更高阶
f(n)=ng(n)=(log^2)nf(n)=Ω(g(n))n更高阶
f(n)=nlogn+ng(n)=lognf(n)=Ω(g(n))nlogn+n更高阶
f(n)=10g(n)=log10f(n)=θ(g(n))同阶
f(n)=(log^2)ng(n)=lognf(n)=Ω(g(n))(log^2)n更高阶
f(n)=2^ng(n)=100n^2f(n)=Ω(g(n))2^n更高阶
f(n)=2^ng(n)=3^nf(n)=O(g(n))3^n更高阶

<2> 算法实现题1-1 统计数字问题

洛谷P2602 [ZJOI2010] 数字计数的简化版

▲解题思路

参考思路:https://acmachineoier.blog.luogu.org/solution-p2602

数据量较大,显然不好直接暴力。

分别统计十个数字出现的个数,对于每个数字,再分别统计其在每一位上的出现情况。综合来看,对于每个数字在每一位上出现情况的统计可以称为一次操作。用循环来遍历数字i,用模板变量m(m为1或10的倍数)来控制操作的位置。

对于一次操作,使用取模和整除将原数n分割成三个部分a/b/c。b为操作的位置,a为操作位置之前的数字,c为操作位置之后的数字。例如372869在m=100时,分割的结果为a=372,b=8,c=69。

在i不为0的情况下:

下面我们将用数字n=372869举例。

若b比i大,也就是说这个位置取i之后,前面可以取到a,后面是可以任意取数字的。在m=100时,b=8,若i取6,那么在8前面我可以从0取到372这一共373个数,后面我可以从00到99共100(即m)个。所以这种情况下结果应该有(a + 1) * m

若b和i相等,也就是说这个位置取i之后,如果前面取到a-1,后面是可以任意取数字的,但前面取到a时,后面有一部分是不可以的。若i取8,那么前面从0到371这一共372个数都是没有问题的,此时后面可以从00到99共100(即m)个,这部分的结果是a*m。但是前面取372时,后面就只能从00到69共70(即c+1)个了,这部分的结果是c+1。合起来一共是a*m+c+1

若b比i小,也就是说前面只能取到比a小,后面可以随便取。若i取9,那么前面只能从0取到371,372都不行。但是好在这样取时,后面是可以从00取到99的。故a*m

在i为0的情况下:

下面我们用数字372069举例。

若b也为0,即m=100,b=0,i=0的这个操作。前面可以从1取到371,此时后面可以随便取。注意为什么前面不能取0!前面取372的时候,后面只能取c+1个。故(a - 1) * m + c + 1

若b不为0,假设m=1000,b=2,i=0的这个操作。前面其实是可以从0取到36的,此时后面可以随便取。但是由于b>0=i,所以若前面取到37,后面肯定不符合了。故a*m

最后只要把上述情况分别讨论,结果总和就可以了。

▲代码

#include<cstdio>
using namespace std;

int main()
{
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    long long n;
    scanf("%lld",&n);
    int ans[10];
    for (int i = 0; i <= 9; i++)
        ans[i] = 0;
    for (int i = 0; i <= 9; i++)
    {
        long long m = 1;
        while (m < n)
        {
            long long a = n / (m * 10);
            long long b = n / m % 10;
            long long c = n % m;
            if (i)
            {
                if (b > i)
                    ans[i] += ((a + 1) * m);
                else if (b == i)
                    ans[i] += (a * m + c + 1);
                else if (b < i)
                    ans[i] += (a * m);
            }
            else
            {
                if (b == 0)
                    ans[i] += ((a - 1) * m + c + 1);
                else if (b)
                    ans[i] += (a * m);
            }
            m *= 10;
        }
    }
    for (int i = 0; i <= 9; i++)
        printf("%d\n",ans[i]);
}

▲验证

测试样例

input 99
output 9 20 20 20 20 20 20 20 20 20
input 11
output 1 4 1 1 1 1 1 1 1 1

<3> 算法实现题1-2 字典序问题

参考思路:https://zhuanlan.zhihu.com/p/112912233

▲解题思路

在这里插入图片描述

▲代码

#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
int n;
string s[1000];
int ans[1000];
int f[27][7];
int g[7];

int func(int i, int k)
{
    if (k == 1)
    {
        f[i][k] = 1;
        return 1;
    }
    int total = 0;
    for (int j = i + 1; j <= 26; j++)
        total += (f[j][k - 1]) ? f[j][k - 1] : func(j, k - 1);
        //如果已经存在,就不用再算一遍了,记忆化搜索
    f[i][k] = total;
    return total;
}

int main()
{
    // build table
    //初始化
    for (int i = 0; i < 27; i++)
        for (int j = 0; j < 7; j++)
            f[i][j] = 0;
    for (int i = 0; i < 7; i++)
        g[i] = 0;

    //填表
    for (int i = 1; i <= 26; i++)
    {
        for (int j = 1; j <= 6; j++)
            if (f[i][j] == 0)
                func(i, j);
    }
    // 计算每种长度字符串的个数放在g[i]
    for (int k = 1; k <= 6; k++)
        for (int i = 1; i <= 26; i++)
            g[k] += f[i][k];

    // check
    /*
    for (int i = 1; i <= 26; i++)
    {
        for (int j = 1; j <= 6; j++)
            cout << f[i][j] << " ";
        cout << endl;
    }
    cout << endl;
    for (int i = 1; i <= 6; i++)
        cout << g[i] << " ";
    */

    // process problem
    cin >> n;
    for (int i = 0; i < n; i++)
        ans[i] = 0;
    for (int i = 0; i < n; i++)
        cin >> s[i];
    for (int i = 0; i < n; i++)
    {
        int length = s[i].size();
        int total = 0;
        int a0 = s[i][0] - 'a' + 1;

        // 比该字符串长度小的字符串个数直接加上(之前计算过每种长度字符串的个数放在g[i])
        for (int j = 1; j < length; j++)
            total += g[j];

        // 与该字符串长度相同,但是首字母不一样的,加上
        // 例如该串首字母d开头,则前面可能有a,b,c开头的,这些需要加上去
        for (int j = 1; j < a0; j++)
            total += f[j][length];

        // 与该字符串相同长度,相同首字母,但每个位置都有可能因为不是紧挨着的而留出别的可能
        // 例如abcde和afghi和afjkl,abcde和afghi之间在第二个位置上留有可能,要考虑b/c/d/e的可能,
        // 故要加上f[2][4],f[3][4],f[4][4],f[5][4],是length-k而不是k因为第二位置引导4位长度的字符串。
        // afghi只有第二个位置存在问题,而afjkl在第二个位置和第三个位置都存在问题,
        // afjkl还需要额外加上f[7][3],f[8][3],f[9][3]这三个,即ghi在第三个位置产生的问题
        // 后面的位置也是同理可得
        for (int k = 1; k < length; k++)
        {
            for (int j = (s[i][k - 1] - 'a' + 1) + 1; j < (s[i][k] - 'a' + 1); j++)
                total += f[j][length - k];
        }

        //前面统计的是到目前为止已有的序号,求自身的序号要+1
        total += 1;

        ans[i] = total;
    }
    for (int i = 0; i < n; i++)
    {
        cout << ans[i] << " ";
    }
}

▲验证

测试样例

input:
5
ab
ac
abcde
xyz
abcdef

output:
27 28 17902 2951 83682 

经过参考代码对拍发现结果完全一致

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1680738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么把图片改成300dpi?照片dpi调整方法

在进行印刷设计时&#xff0c;例如制作海报、宣传册、名片、杂志等&#xff0c;通常要求图片具有高分辨率&#xff0c;将图片分辨率设为300dpi可以确保图像在印刷过程中保持细节和清晰度&#xff0c;但是修改图片分辨率的方法有哪些呢?今天小编整理了几个关于改变图片分辨率的…

OpenAI王炸更新GPT-4o,具有极强的文本、图片、视频、语音混合理解能力

OpenAI刚刚发布了GPT-4o&#xff0c;这是一种新的人工智能模式&#xff0c;集合了文本、图片、视频、语音的全能模型。能够实时响应用户的需求&#xff0c;并通过语音来实时回答你&#xff0c;你可以随时打断它。还具有视觉能力&#xff0c;能识别视觉物体并根据视觉作出快速的…

使用Docker进行Jmeter分布式搭建

大家好&#xff0c;随着技术的不断发展&#xff0c;对性能测试的要求也日益提高。在这样的背景下&#xff0c;如何利用 Docker 来巧妙地搭建 Jmeter 分布式成为了关键所在。现在&#xff0c;就让我们开启这场探索之旅&#xff0c;揭开其神秘的面纱。前段时间给大家分享了关于 L…

Java ( 框架界面 , 按钮 , 动作监听ActionListener ,鼠标监听MouseListener,键盘监听KeyListener)的使用方法

package 拼图阶段任务.ui;import javax.swing.*; import java.awt.*; import java.awt.event.*;public class UseMethod {public static void main(String[] args) { // 框架的用法JFrame jf new JFrame();// 设置界面的宽高jf.setSize(603,680);// 设置界面的标题jf.setTitle…

k8s 二进制安装 详细安装步骤

目录 一 实验环境 二 操作系统初始化配置&#xff08;所有机器&#xff09; 1&#xff0c;关闭防火墙 2&#xff0c;关闭selinux 3&#xff0c;关闭swap 4, 根据规划设置主机名 5, 做域名映射 6&#xff0c;调整内核参数 7&#xff0c; 时间同步 三 部署 dock…

Git项目管理——提交项目和版本回退(二)

个人名片&#xff1a; &#x1f393;作者简介&#xff1a;嵌入式领域优质创作者&#x1f310;个人主页&#xff1a;妄北y &#x1f4de;个人QQ&#xff1a;2061314755 &#x1f48c;个人邮箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;个人微信&#xff1a;Vir2025WB…

嵌入式——C51版本Keil环境搭建

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 目标搭建流程下载与安装激活STC环境添加校验是否导入STC环境 目标 ● 了解C51版本Keil开发环境的概念和用途 ● 掌握C51版本Keil环…

PG Vacuum 空间管理工具与pg_freespacemap使用

1.什么是Vacuum&#xff1a; PG pageinspect使用与块空间清理学习-CSDN博客 之前说过PG块更新的特点:先删除后插入&#xff0c;但老元组并不会真正删除&#xff0c;只是把老元组标记为删除状态&#xff0c;这就导致了PG中会有大量的垃圾数据&#xff0c;update所造成的资源消…

LeetCode518:零钱兑换Ⅱ

题目描述 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带符号…

进程信号 signal

文章目录 信号基础信号的产生OS中的时间 信号的保存sigset_tsigprocmasksigpending 信号的捕捉用户态和内核态sigactionvolatile SIGCHLD 信号基础 生活中的信号 你在网上买了很多件商品&#xff0c;再等待不同商品快递的到来。但即便快递没有到来&#xff0c;你也知道快递来临…

Blog搭建:pycharm+虚拟环境+django

pycharm创建项目 在pycharm新建项目&#xff0c;选择Django 项目名称&#xff1a;自定义项目位置&#xff1a;自定义创建git&#xff1a;方便上传到github选择虚拟环境方式venvpython解释器位置&#xff0c;和版本&#xff0c;如果你没有下载他会跳转到不同版本的供你下载temp…

分布式计算、并行计算、网格计算、边缘计算

分布式计算 分布式计算是一种计算方法&#xff0c;它将一个大型的计算任务分解成多个子任务&#xff0c;并将这些子任务分布在网络上的多台计算机&#xff08;节点&#xff09;上同时执行。这些节点通过通信网络协同工作&#xff0c;共同完成任务。每个节点可以独立处理自己的…

Skywalking配置traceId

1.引言 1.1 SkyWalking概述 SkyWalking是一个开源的分布式系统观测平台&#xff0c;旨在解决微服务和云原生架构中常见的性能监控和故障排除问题。自2015年由Apache基金会孵化以来&#xff0c;SkyWalking已经成为全球范围内广泛使用的APM&#xff08;应用性能管理&#xff09…

括号生成[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 数字n代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())(…

MATLAB车辆动力学建模 ——《控制系统现代开发技术》

引言 在上这门课之前&#xff0c;我已经用过CasADi 去做过最优化的相关实践&#xff0c;其中每一步迭代主要就是由&#xff1a;对象系统优化求解两部分组成的。这里我们重点介绍 “对象系统”如何去描述 &#xff0c;因为它是每一步迭代中重要的一环——“优化求解”会获得控制…

2024生日快乐祝福HTML源码

源码介绍 2024生日快乐祝福HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c; 源码截图 源码下载 2024生日快乐祝福HTML源码

【C++】学习笔记——多态_1

文章目录 十二、继承8. 继承和组合 十三、多态1. 多态的概念2. 多态的定义和实现虚函数重写的两个特殊情况override 和 final 3. 多态的原理1. 虚函数表 未完待续 十二、继承 8. 继承和组合 我们已经知道了什么是继承&#xff0c;那组合又是什么&#xff1f;下面这种情况就是…

哈希表+DFS快速解决力扣129题:求根节点到叶节点数字之和

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

TypeScript高级类型 在鸿蒙中的使用 Partial、Required、Readonly、Pick、Record

我的工程代码在这里&#xff0c;持续更新中 欢迎交流&#xff0c;谢谢 https://github.com/MartinLi89/WanHarmony Partial <Type> 新定义 一个类型&#xff0c;将所有属性变为可选的类. class TextTS {a: string "1"b: string "2"c: string &…

(十一)Python基础练习题二(50道选择题)#Python

本文整理了Python基础知识相关的练习题&#xff0c;共50道&#xff0c;适用于刚入门初级Python想巩固基础的同学。来源&#xff1a;如荷学数据科学题库&#xff08;技术专项-Python一&#xff09;。序号之前的题请看往期文章。 51&#xff09; 52&#xff09; 53&#xff09; …