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

算法学习——华为机考题库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")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端 - 基础 列表标签 - 自定义列表 详解

使用场景 &#xff1a; 常用于对术语或名词进行解释和描述&#xff0c;定义列表的列表前没有任何项目符号。 在 HTML 标签中&#xff0c; < dl > 标签用于定义 描述列表 &#xff08; 或定义列表 &#xff09; 该标签会与 <dt> ( 定义项目/名字 ) 和 <dd…

从0搭建react+ts+redux+axios+antd项目

文章目录 一、安装及初始化二、TypeScript配置三、Webpack配置四、Prettier统一编码风格五、使用less六、Antd 安装及使用七、添加redux及使用八、添加Router及配置九、安装axios十、echarts按需引入 本文介绍了如何用creat-react-app脚手架搭建一个react项目的基本结构&#x…

UE4 C++ 静态加载类和资源

静态加载类和资源&#xff1a;指在编译时加载&#xff0c;并且只能在构造函数中编写代码 .h //增加所需组件的头文件 #include "Components/SceneComponent.h" //场景组件 #include "Components/StaticMeshComponent.h" //静态网格体组件 #include &qu…

VS2019+CAXACAD2023二次开发教程(一、环境搭建)

前言 CAXACAD2023的二次开发相关文件和库都在installpath\CRX\的文件夹下。 CAXACAD2023的默认开发环境是VS2019,如果是用VS2019的环境话,可以直接安装"installpath\CRX\Wizard\CRXWizard_VS2019.exe"这个插件,安装好后就可以一键新建的项目,新建的项目会自动帮…

【漏洞复现】EPON上行A8-C政企网关信息泄露漏洞

Nx01 产品简介 EPON上行A8-C政企网关是一款终端产品&#xff0c;提供企业网络解决方案。 Nx02 漏洞描述 EPON上行A8-C政企网关敏感信息泄露漏洞&#xff0c;攻击者通过敏感信息泄露获取管理员密码。 Nx03 产品主页 fofa-query: "ZXECS" && title"Web…

蓝桥杯每日一题----区间dp

前言 暂时没啥好说的&#xff0c;直接进入正题吧 引入 涂色PAINT 读题发现要求的是使一段区间满足要求的最小操作次数&#xff0c;考虑用动态规划去做。 第一步&#xff1a;考虑缩小规模&#xff0c;这里的规模其实就是区间长度&#xff0c;那么dp数组应该可以表示某个区间&…

certificate has expired错误解决

npm ERR! request to https://registry.npm.taobao.org/nodemon failed, reason: certificate has expired错误解决 npm在安装依赖包时出现以下错误。 作为最后的手段&#xff0c;你可以配置npm忽略SSL证书验证。这不是一个推荐的解决方案&#xff0c;因为它会降低安全性&…

window 镜像---负载篇

前提&#xff1a;需要修改window的powershell执行脚本的策略 步骤&#xff1a;以管理员身份打开powershell&#xff0c;执行 Get-ExecutionPolicy查看当前执行策略&#xff0c;若返回值是Restricted&#xff0c;需执行Set-ExecutionPolicy RemoteSigned powershell 版本信息&am…

计算机网络第6章(应用层)

6.1、应用层概述 我们在浏览器的地址中输入某个网站的域名后&#xff0c;就可以访问该网站的内容&#xff0c;这个就是万维网WWW应用&#xff0c;其相关的应用层协议为超文本传送协议HTTP 用户在浏览器地址栏中输入的是“见名知意”的域名&#xff0c;而TCP/IP的网际层使用IP地…

YouTrack 用户登录提示 JIRA 错误

就算输入正确的用户名和密码&#xff0c;我们也得到了下面的错误信息&#xff1a; youtrack Cannot retrieve JIRA user profile details. 解决办法 出现这个问题是因为 YouTrack 在当前的系统重有 JIRA 的导入关联。 需要把这个导入关联取消掉。 找到后台配置的导入关联&a…

【JMeter】使用技巧

在这此对新版本jmeter的学习温习的过程&#xff0c;发现了一些以前不知道的功能&#xff0c;所以&#xff0c;整理出来与大分享。本文内容如下。 如何使用英文界面的jmeter如何使用镜像服务器Jmeter分布式测试启动Debug 日志记录搜索功能线程之间传递变量 如何使用英文界面的…

SpringBoot实现统一异常处理

文章目录 前言实现步骤定义统一响应对象类定义业务异常枚举接口和实现定义业务异常基类定义全局异常处理切面测试和验证 总结 前言 近日心血来潮想做一个开源项目&#xff0c;目标是做一款可以适配多端、功能完备的模板工程&#xff0c;包含后台管理系统和前台系统&#xff0c…

Docker 搭建mysql 集群(二)

PXC方案 很明显 PXC方案在任何一个节点写入的数据都会同步到其他节点&#xff0c;数据双向同步的&#xff08;在任何节点上都可以同时读写&#xff09; 创建MySQL PXC集群 1 安装PXC镜像 docker pull percona/percona-xtradb-cluster:5.7.21 2 为PXC镜像改名 docker tag pe…

数据分析基础之《pandas(3)—DataFrame运算》

一、算术运算 1、add() 加法运算 2、sub() 减法运算 3、想要得到每天的涨跌幅大小&#xff0c;求出每天close-open价格差 # 算术运算 close data[close] open1 data[open] # 收盘价减去开盘价 data[m_price_change] close.sub(open1) data.head() 二、逻辑运算 1、逻辑…

Transformer实战-系列教程5:Vision Transformer 源码解读3

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 6、Block类------构造函数 class Block(nn.Module):def __init__(self, config, vis):super(Blo…

【C++】类和对象(2)

这篇博客继续学习类和对象~&#xff0c;主要介绍了类的6个默认成员函数。 目录 类的6个默认成员函数 构造函数 概念 特性 析构函数 概念 特性 拷贝构造函数 特性 赋值运算符重载 运算符重载 赋值运算符重载 前置和后置重载 日期类的实现 const成员 取地址及cons…

FTP口令问题

FTP&#xff08;File Transfer Protocol &#xff0c;文件传输协议&#xff09;是一个文件传输协议&#xff0c;用户通 过FTP可从客户机程序向远程主机上传或下载文件&#xff0c;常用于网站代码维护、 日常 源码备份等。如果攻击者通过FTP匿名访问或者通过弱口令破解获取FTP…

Linux进程信号(2)--信号的保存

目录 1.阻塞信号 1.1 信号其他相关常见概念 1.实际执行信号的处理动作称为信号递达(Delivery&#xff09; 2.信号从产生到递达之间的状态,称为信号未决(Pending)。 3.进程可以选择阻塞 (Block )某个信号。 1.2信号在内核中的表示 sigset_t 信号集操作函数 使用sigprocm…

JAVA-File五个练习

下面习题思路大多都是&#xff1a; 1.获取路径下所有列表&#xff08;listfiles&#xff09;&#xff0c;2.遍历文件或文件夹&#xff08;增强for&#xff09;&#xff0c;3.判断是否是文件&#xff08;isFile&#xff09;并直接执行逻辑&#xff0c;4.判断当前是文件夹的情况&…

【React】redux状态管理、react-redux状态管理高级封装模块化

【React】react组件传参、redux状态管理 一、redux全局状态管理1、redux概述2、redux的组成1.1 State-状态1.2 Action-事件1.3 Reducer1.4 Store 3、redux入门案例1.1 前期准备1.2 构建store1.2.1 在src下新建store文件夹1.2.2 在store文件夹下新建index.ts文件1.2.3 在index.t…