算法学习——华为机考题库7(HJ41 - HJ45)

news2024/12/24 11:36:17

算法学习——华为机考题库7(HJ41 - HJ45)

HJ41 称砝码

描述

现有n种砝码,重量互不相等,分别为 m1,m2,m3…mn ;
每种砝码对应的数量为 x1,x2,x3…xn 。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。

注:

称重重量包括 0

数据范围:每组输入数据满足 1≤n≤10 , 1≤m ≤2000 , 1≤x i ≤10
输入描述:
对于每组测试数据:
第一行:n — 砝码的种数(范围[1,10])
第二行:m1 m2 m3 … mn — 每种砝码的重量(范围[1,2000])
第三行:x1 x2 x3 … xn — 每种砝码对应的数量(范围[1,10])
输出描述:
利用给定的砝码可以称出的不同的重量数

示例

在这里插入图片描述

代码解析

#include <iostream>
#include <set>
#include <vector>
using namespace std;



int main() {
    int N;
    cin>>N;
    vector<int> weight;
    vector<int> num;
    vector<int> block;
    
    int tmp;
    for(int i=0 ; i<N ;i++)
    {
        cin>>tmp;
        weight.push_back(tmp);
    }
    
    for(int i=0 ; i<N ;i++)
    {
        cin>>tmp;
        num.push_back(tmp);
    }

    for(int i=0 ; i<N ;i++)
    {   
        while(num[i]--)
            block.push_back(weight[i]);
    }
    set<int> myset;
    myset.insert(0);
    for(int i=0 ; i<block.size() ;i++)
    {
        set<int> myset2(myset);

        for(auto it:myset2)
            myset.insert(it + block[i]);
        

    }

    // for(auto it:myset)
    //     cout<<it<<' ';

    cout<<myset.size()<<endl;

}
// 64 位输出请用 printf("%lld")

HJ42 学英语

描述

Jessi初学英语,为了快速读出一串数字,编写程序将数字转换成英文:

具体规则如下:
1.在英语读法中三位数字看成一整体,后面再加一个计数单位。从最右边往左数,三位一单位,例如12,345 等
2.每三位数后记得带上计数单位 分别是thousand, million, billion.
3.公式:百万以下千以上的数 X thousand X, 10亿以下百万以上的数:X million X thousand X, 10 亿以上的数:X billion X million X thousand X. 每个X分别代表三位数或两位数或一位数。
4.在英式英语中百位数和十位数之间要加and,美式英语中则会省略,我们这个题目采用加上and,百分位为零的话,这道题目我们省略and

下面再看几个数字例句:
22: twenty two
100: one hundred
145: one hundred and forty five
1,234: one thousand two hundred and thirty four
8,088: eight thousand (and) eighty eight (注:这个and可加可不加,这个题目我们选择不加)
486,669: four hundred and eighty six thousand six hundred and sixty nine
1,652,510: one million six hundred and fifty two thousand five hundred and ten

说明:
数字为正整数,不考虑小数,转化结果为英文小写;
保证输入的数据合法
关键字提示:and,billion,million,thousand,hundred。

数据范围: 1≤n≤2000000

输入描述:
输入一个long型整数

输出描述:
输出相应的英文写法

示例

在这里插入图片描述

代码解析

#include <iostream>
#include <string>
#include <vector>
using namespace std;


vector<string> other = {"zero", "one", "two", "three", "four", "five", "six", "seven",
                        "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen",
                           "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};

vector<string> ften = {"none", "ten", "twenty", "thirty", "forty", "fifty", "sixty",
                        "seventy", "eighty", "ninety"};

string englishnum(long num)
{
    if(num >= 0 && num <= 19) return other[num];
    else if(num>=20 && num<=99)
    {
        if(num%10 == 0) return ften[num/10];
        else  return ften[num/10]+" "+englishnum(num%10);
    } 
    else if(num>=100 && num<=999) 
    {
        if(num%100 == 0) return other[num/100]+" hundred";
        else return englishnum(num/100)+" hundred and "+ englishnum(num%100);
    }
    else if(num>=1000 && num<=999999) 
    {
        if(num%1000 == 0) return englishnum(num/1000)+" thousand";
        else return englishnum(num/1000)+" thousand "+englishnum(num%1000);
    }
    else if(num>=1000000&&num<=999999999)
    {
        if(num%1000000==0) return englishnum(num/1000000)+" million";
        else return englishnum(num/1000000)+" million "+englishnum(num/1000%1000)+" thousand "+englishnum(num%1000);
    }
    else if(num>=1000000000)
    {
        if(num%1000000000==0) return other[num/1000000000]+" billion";
        else return englishnum(num/1000000000)+" billion "+englishnum(num%10000000/1000000)+ 
            " million "+englishnum(num%1000000/1000)+" thousand "+englishnum(num%1000);
    }
    return "";

}

int main() 
{
    long num;
    cin>>num;
    cout<<englishnum(num)<<endl;
}
// 64 位输出请用 printf("%lld")

HJ43 迷宫问题

描述

定义一个二维数组 N*M ,如 5 × 5 数组下所示:

int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。入口点为[0,0],既第一格是可以走的路。

数据范围: 2≤n,m≤10 , 输入的内容只包含 0≤val≤1

输入描述:
输入两个整数,分别表示二维数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。

输出描述:
左上角到右下角的最短路径,格式如样例所示。

示例

在这里插入图片描述
在这里插入图片描述

代码解析

#include <climits>
#include <iostream>
#include <utility>
#include <vector>
using namespace std;

int n,m;
int fornt[4][2] = {-1,0,1,0,0,-1,0,1};
vector<vector<vector<int>>> result2;

void dfs(vector<vector<int>> &date , vector<vector<bool>> &path , vector<vector<int>> &result , int x , int y)
{
    if(path[x][y] == true) return;
    path[x][y] = true;
    
    if(date[x][y] == 1) return;
    
    if(x == n-1 && y == m-1) result2.push_back(result);
    

    int new_x , new_y;
    for(int i=0 ; i < 4 ; i++)
    {
        new_x = x + fornt[i][0];
        new_y = y + fornt[i][1];
       
        if( new_x < 0 || new_x >= n || new_y < 0 || new_y >= m) continue;
       
        result.push_back({new_x,new_y});
        dfs(date,path,result,new_x,new_y);
        result.pop_back();
    }
    return ;

}

int main() {
    int tmp;
    cin>>n>>m;
    vector<vector<int>> date(n,vector<int>(m,0));
    vector<vector<int>> result;
   
    vector<vector<bool>> path(n,vector<bool>(m,false));
    for(int i=0 ; i<n ; i++)
    {
        for(int j=0 ; j<m ; j++)
        {
            cin>>tmp;
            date[i][j] = tmp;
        }
    }

    result.push_back({0,0});
    dfs(date,path,result,0,0);

    
    pair<int, int> minResult = {INT_MAX,INT_MAX};
    for(int i=0 ; i<result2.size() ; i++)
    {
        if(result2[i].size() < minResult.second) 
        {
            minResult.first = i;
            minResult.second = result2[i].size();
        }
    }

    for(int i=0 ; i< minResult.second ; i++)
    {
        cout<<'('<<result2[minResult.first][i][0]<<","<<result2[minResult.first][i][1]<<")"<<endl;
    }







}
// 64 位输出请用 printf("%lld")

HJ44 Sudoku

描述

问题描述:数独(Sudoku)是一款大众喜爱的数字逻辑游戏。玩家需要根据9X9盘面上的已知数字,推算出所有剩余空格的数字,并且满足每一行、每一列、每一个3X3粗线宫内的数字均含1-9,并且不重复。
例如:
输入
在这里插入图片描述
输出
在这里插入图片描述
数据范围:输入一个 9*9 的矩阵
输入描述:
包含已知数字的9X9盘面数组[空缺位以数字0表示]

输出描述:
完整的9X9盘面数组

示例

在这里插入图片描述

代码解析

#include <iostream>
#include <set>
#include <vector>
using namespace std;

bool flag = false;

bool cheack(vector<vector<int>> &date , int x , int y ,int value)
{
    //行
    for(int j=0 ; j<9 ; j++)
    {
        if(  date[x][j]  == value ) return false; 
    }

     //列
    for(int j=0 ; j<9 ; j++)
    {
        if( date[j][y] == value) return false; 
      
    }

    //块
    int newx = x - x%3;
    int newy = y - y%3;
    for(int n = newx ; n < newx + 3 ; n++)
    {
        for(int m = newy ; m < newy + 3 ; m++)
        {
            if( date[n][m] == value) return false; 
            
        }
    }
  
    return true;
}

void dfs(vector<vector<int>> &date , int x , int y)
{
    //cout<<x<<' '<<y<<" date:"<<date[x][y]<<endl;
    
    if(date[x][y] != 0)
    {
        if(x==8 && y==8) 
        {
            flag = true;
            return;
        }

        if(y != 8) dfs(date,x,y+1);
        else dfs(date,x+1,0);

        return;
    }
    // cout<<x<<' '<<x<<' '<<date[x][y]<<endl;
    for(int i=1 ; i<=9 ; i++)
    {
     
        if(cheack(date, x, y, i) == true) 
        {
            date[x][y] = i;

           if(x==8 && y==8)
            {
                flag = true;
                return;
            }
            
            if(y != 8) dfs(date,x,y+1);
            else dfs(date,x+1,0);

            if(flag == false) date[x][y] = 0;
        }
    }

}

int main() {
    vector<vector<int>> date(9,vector<int>(9,0));
    
    int tmp;
    for(int i=0 ; i<9 ;i++)
    {
        for(int j=0 ; j<9 ;j++)
        {
            cin>>tmp;
            date[i][j] = tmp;
        }
    }


    dfs(date, 0, 0);


    for(int i=0 ; i<9 ;i++)
    {
        for(int j=0 ; j<9 ;j++)
        {
            cout<<date[i][j]<<' ';
        }
        cout<<endl;
    }


    
}
// 64 位输出请用 printf("%lld")

HJ45 名字的漂亮度

描述

给出一个字符串,该字符串仅由小写字母组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个不同字母拥有相同的“漂亮度”。字母忽略大小写。

给出多个字符串,计算每个字符串最大可能的“漂亮度”。

本题含有多组数据。

数据范围: 输入的名字长度满足 1≤n≤10000

输入描述:
第一行一个整数N,接下来N行每行一个字符串

输出描述:
每个字符串可能的最大漂亮程度

示例

在这里插入图片描述

代码解析

#include <algorithm>
#include <iostream>
#include <map>
#include <string>
#include <utility>
#include <vector>
using namespace std;

int beatiful(string &str)
{
    map<char, int> mymap;
    for(auto it:str)
        mymap[it]++;
    
    vector<pair<char,int>> vec(mymap.begin() , mymap.end());

    sort(vec.begin(), vec.end() , [](pair<char, int> &p1 , pair<char, int> &p2){return p1.second > p2.second;});
    
    int value = 26;
    for(int i=0 ; i<vec.size() ; i++)
    {
        vec[i].second = value;
        value--;
    }

    int result = 0;
    for(auto it:str)
    {
        for(auto it2 : vec)
        {
            if(it == it2.first) 
            {
                result += it2.second;
                break;
            }
        }
    }
    

    return result;

}

int main() {
    int N;
    cin>>N;
    vector<string> date;
    string tmp;
    while(N--)
    {
        cin>>tmp;
        date.push_back(tmp);
    }

    for(auto it:date)
        cout<<beatiful(it)<<endl;

}
// 64 位输出请用 printf("%lld")

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

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

相关文章

STM32--揭秘中断(简易土货版)

抢占优先级响应优先级 视频学习--中断​​​​​​​

数据结构----队列(Queue)的概念、队列的使用、模拟实现队列、循环队列、模拟实现循环队列、双端队列、模拟实现双端队列

文章目录 1 概念2 队列的使用3 队列模拟实现4 循环队列4.1 循环队列 概念4.1 循环队列模拟实现 5. 双端队列 (Deque)6 用队列实现栈7 用栈实现队列 1 概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有…

会计的记账凭证

目录 一. 记账凭证的填制与审核1.1 收付款凭证1.2 转账凭证1.3 单式记账凭证 二. 记账凭证的编号 \quad 一. 记账凭证的填制与审核 \quad \quad 1.1 收付款凭证 \quad 注意︰ 凡是涉及货币资金之间收付款的业务如将库存现金存入银行或从银行提取现金等类经济业务。在实际工作中…

macOS的设置与常用软件(含IntelliJ IDEA 2023.3.2 Ultimate安装,SIP的关闭与开启)

目录 1 系统设置1.1 触控板1.2 键盘 2 软件篇2.1 [科学上网](https://justmysocks5.net/members/)2.1 [安装Chrome浏览器](https://www.google.cn/chrome/index.html)2.2 [安装utools](https://www.u.tools)2.3 [安装搜狗输入法](https://shurufa.sogou.com/)2.4 [安装snipaste…

Qt多语言翻译

Qt多语言翻译概述 Qt提供了非常简单易用的多语言翻译机制&#xff0c;其核心类为QTranslator.概括来说就是利用Qt的lupdate工具将项目中所有tr函数包裹的字符串提取到.ts文件中&#xff0c;然后使用Qt Linguist由专门的翻译人员对提取的.ts文件进行逐个单词短语的翻译工作. 翻译…

MkDocs 部署指南

简介 MkDocs 可以同时编译多个 markdown 文件&#xff0c;形成书籍一样的文件。有多种主题供你选择&#xff0c;很适合项目使用。 MkDocs 是快速&#xff0c;简单和华丽的静态网站生成器&#xff0c;可以构建项目文档。文档源文件在 Markdown 编写&#xff0c;使用单个 YAML …

绝世唐门:霍挂六个十万年魂环,一穿七灭团再现,淘汰赛顺利晋级

Hello,小伙伴们&#xff0c;我是拾荒君。 国漫《斗罗大陆2绝世唐门》第32期超前爆料&#xff0c;霍雨浩开局便释放六个十万年魂环&#xff0c;以绝对的气场碾压天灵学院代表队。首次参与高级魂师大赛&#xff0c;霍雨浩便大放异彩秀出超级霍挂&#xff0c;此等操作就连当初的唐…

2023.12 淘天-数科 已offer

文章目录 岗位信息1面ld 12.17 1H2面 VP 12.18 40min3面 HR 12.2012.21offer薪资方案沟通 岗位信息 1面ld 12.17 1H &#xff08;是一个从业估计很长时间前辈&#xff0c;很平和&#xff0c;感觉能学到很多东西&#xff09; 自我介绍项目深究1.说下自己工作里最有成就感的事和…

【用Unity开发一款横板跳跃游戏部分需要学习的技术点指南】

*** 用Unity开发一款横板跳跃游戏部分需要学习的技术点指南 空洞骑士是一款基于横板平台跳跃的传统风格2D动作冒险游戏&#xff0c;庞大的游戏世界交错相通&#xff0c;玩家控制小虫子去探索幽深黑暗的洞穴&#xff0c;成为了一代人茶余饭后的惦念&#xff0c;深受玩家喜爱。 …

Peter算法小课堂—Dijkstra最短路算法

大家好&#xff0c;我们人见人爱、花见花开、车见车爆胎的Peter Pan来啦&#xff0c;hia~hia~hia。今天&#xff0c;我们今天来学习毒瘤的最短路算法啦。啊这……什么是Dijkstra算法&#xff1f;长文警告⚠ 正经点啊 手算样例 大家思考一下&#xff0c;你在手算样例的时候&am…

MATLAB实现随机森林(RF)回归与自变量影响程度分析

本文分为两部分&#xff0c;首先是对代码进行分段、详细讲解&#xff0c;方便大家理解&#xff1b;随后是完整代码&#xff0c;方便大家自行尝试。另外&#xff0c;关于基于MATLAB的神经网络&#xff08;ANN&#xff09;代码与详细解释&#xff0c;我们将在后期博客中介绍。 1…

Redis常用数据结构与应用场景

常用数据结构 StringHashListSetZset String常用操作 String应用场景 Hash常用操作 hash应用场景 Hash结构优缺点 优点 同类数据归类整合存储,方便数据管理相比String操作消耗内存与spu更小相比string更节省空间 缺点 过期功能不能使用在field上,只用用在key上Redis集群…

Navicate 连接云服务器MySQL

Navicate 连接云服务器MySQL 1.打开Navicate,点击左上角的连接,选择MySQL 第一步:第一个页面是常规,按照图上的标注填写 第二步,点击 SSH ,进入下面的页面 第三步&#xff0c;点击测试连接

FreeRTOS任务相关的API函数

本篇文章记录我学习FreeRTOS的任务相关的API函数。主要涉及FreeRTOS的任务创建和删除函数、任务挂起和恢复函数。希望我的分享对你有所帮助。 读者如果需要实战FreeRTOS动态/静态任务创建和删除&#xff0c;可以参考以下文章&#xff1a; FreeRTOS动态 / 静态创建和删除任务-CS…

C++初阶 内存管理和模板

目录 一、new 1.1什么是new&#xff1f; 1.2为什么要有new&#xff1f; 1.3使用new 1.4 new的超级好处 二、delete 2.1什么是delete&#xff1f; 2.2为什么要有delete&#xff1f; 2.3使用delete 三、 malloc / free和new / delete的共同点和区别 四、浅谈模板 4.1什…

嵌入式学习第三篇——51单片机

目录 1&#xff0c;嵌入式系统 1&#xff0c;嵌入式系统的定义 2&#xff0c;单片机的定义 2&#xff0c;51单片机 1&#xff0c;开发环境 2&#xff0c;开发板使用的基本思路 1&#xff0c;查看原理图&#xff0c;查看芯片手册 2&#xff0c;获得调用硬件的管…

使用Arcgis对欧洲雷达高分辨率降水数据重投影

当前需要使用欧洲高分辨雷达降水数据&#xff0c;但是这个数据的投影问题非常头疼。实际的投影应该长这样&#xff08;https://gist.github.com/kmuehlbauer/645e42a53b30752230c08c20a9c964f9?permalink_comment_id2954366https://gist.github.com/kmuehlbauer/645e42a53b307…

4K Video Downloader forMac/win:畅享高清视频下载的终极利器!

在如今的数字时代&#xff0c;高清视频已经成为人们生活中不可或缺的一部分。无论是观看精彩的电影、音乐视频&#xff0c;还是学习教育类的在线课程&#xff0c;我们都希望能够以最清晰流畅的方式来欣赏。而为了满足这一需求&#xff0c;我们需要一款功能强大的高清视频下载软…

一文读懂C++的类和对象以及多态的原理

现实生活中&#xff0c;关于类和对象最好的例子是自然界的动物类&#xff0c;本文将以此为场景逐步引入C的概念&#xff0c;达到学习的目的。因为C这门语言本身有很多繁杂的内容&#xff0c;而网上的资源也是参差不齐&#xff0c;有的人见山谈山遇水聊水&#xff0c;有多人故弄…

Vue3 - 从 vue2 到 vue3 过渡,这一套就够了(案例 + 效果演示)(二)

目录 一、组合式 API 的使用 1.1、watch 函数 1.2、watchEffect 函数 1.3、toRef 和 toRefs 1.3.1、toRef 1.3.2、toRefs 1.4、vue3 的声明周期 一、组合式 API 的使用 1.1、watch 函数 与 vue2.x 中的 watch 配置功能一致&#xff0c;但是多了一些坑&#xff1a; 这…