华为OD机考--TVL解码--GPU算力--猴子爬台阶--两个数组前K对最小和--勾股数C++实现

勾股数 题目0001

题目描述:

如果三个正整数A、B、C ,A²+B²=C²则为勾股数
如果ABC之间两两互质,即A与B,A与C,B与C均互质没有公约数,
则称其为勾股数元组。
请求出给定n~m范围内所有的勾股数元组

输入描述

起始范围
1 < n < 10000
n < m < 10000

输出描述

ABC保证A<B<C
输出格式A B C
多组勾股数元组,按照A B C升序的排序方式输出。
若给定范围内,找不到勾股数元组时,输出Na

示例一

  • 输入

    1
    20
    
  • 输出

    3 4 5
    5 12 13
    8 15 17
    

示例二

  • 输入

    5
    10
    
  • 输出

    Na
    

源码



//
// Created by HANWENKE on 2022/8/27.
//

#include <iostream>
#include <vector>
#include <algorithm>
using  namespace  std;
bool prime(const int &x,const int &y){
    if(x==1||y==1){
        return false;
    }
    int mmin=min(x,y);
    for(int i=2;i<=mmin;i++){
        if(x%i==0&&y%i==0){
            return false;
        }
    }
    return true;
}
int main(){
    int n,m;
    cin>>n>>m;
    vector<int>temp;//记录临时元素
    vector<vector<int>>res;//记录最终结果
    bool flag= true;
    //三个元素互质--必定不能够相等
    for(int a=n;a<m;a++){
        for(int b=a+1;b<m;b++){
            for(int c=b+1;c<m;c++){
                if(prime(a,b)&& prime(c,b)&& prime(a,c)){
                    if(a*a+b*b==c*c){
                        temp={a,b,c};
                        flag= false;
                        res.push_back(temp);
                        temp.clear();
                    }
                }
            }
        }
    }
    if(!flag){
        for(int i=0;i<res.size();i++){
            for(int j=0;j<res[i].size();j++){
                cout<<res[i][j]<<" ";
            }
            cout<<endl;
        }
    }else{
        cout<<"Na"<<endl;
    }
    return 0;
}

两个数组前K对-合最小题目0002

题目描述:

给定两个整数数组,arr1、arr2,数组元素按升序排列;
假设从arr1、arr2中分别取出一个元素,可构成一对元素;
现在需要取出k对元素,并对取出的所有元素求和,计算和的最小值;
注意:两对元素对应arr1、arr2的下标是相同的,视为同一对元素。

输入描述

输入两行数组arr1、arr2
每行首个数字为数组大小size, 0 < size <= 100
arr1,arr2中的每个元素e, 0< e <1000
接下来一行,正整数k 0 < k <= arr1.size * arr2.size

输出描述

满足要求的最小值

示例一

  • 输入

    1 1 2
    1 2 3
    2
    
  • 输出

    4
    
  • 说明:
    用例中需要取两个元素,取第一个数组第0个元素与第二个数组第0个元素组成一个元素[1,1];
    取第一个数组第1个元素与第二个数组第0个元素组成一个元素[1,1];
    求和为1+1+1+1=4 ,满足要求最小

源码

//
// Created by HANWENKE on 2022/8/27.
//
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
using  namespace  std;
class Solution{
public:
    void Cin(vector<int>&arr1,vector<int>&arr2,int &k){
        string s1;
        getline(cin,s1);
        /*第一步:接收字符串 s ;
        第二步:遍历字符串 s ,把 s 中的逗号换成空格;
        第三步:通过 istringstream 类重新读取字符串 s ;*/
        istringstream ss(s1);
        int temp;
        while(ss>>temp){
            arr1.push_back(temp);
        }
        string s2;
        getline(cin,s2);
        istringstream s(s2);
        while(s>>temp){
            arr2.push_back(temp);
        }
        cin>>k;
    }
    void getsum(vector<int>&arr1,vector<int>&arr2,int &k){
        int length=arr1.size()*arr2.size();
        vector<int>sum;
        sum.reserve(length);
        for(auto x:arr1){
            for(auto y:arr2){
                sum.push_back(x+y);
            }
        }
        int res=0;
        sort(sum.begin(),sum.end());
        for(int i=0;i<k;i++){
            res+=sum[i];
        }
        cout<<res;
    }
};
int main(){
    vector<int>arr1;
    vector<int>arr2;
    arr1.reserve(100);
    arr2.reserve(100);
    int k;
    Solution l;
    l.Cin(arr1,arr2,k);
    l.getsum(arr1,arr2,k);
    return 0;
}

TVL 解码– 题目0003

题目描述:

TLV编码是按TagLengthValue格式进行编码的,一段码流中的信元用tag标识,tag在码流中唯一不重复,length表示信元value的长度,value表示信元的值,码流以某信元的tag开头,tag固定占一个字节,length固定占两个字节,字节序为小端序,现给定tlv格式编码的码流以及需要解码的信元tag,请输出该信元的value。

输入码流的16进制字符中,不包括小写字母;
且要求输出的16进制字符串中也不要包含小写字母;
码流字符串的最大长度不超过50000个字节。

输入描述

第一行为第一个字符串 ,表示待解码信元的tag;
输入第二行为一个字符串, 表示待解码的16进制码流;
字节之间用空格分割。

输出描述

输出一个字符串,表示待解码信元以16进制表示的value。

示例一

  • 输入

    31
    32 01 00 AE 90 02 00 01 02 30 03 00 AB 32 31 31 02 00 32 33 33 01 00 
    
  • 输出

    32 33
    
  • 说明
    需要解析的信源的tag是31;
    从码流的起始处开始匹配,tag为32的信元长度为1(01 00,小端序表示为1);
    第二个信元的tag为90 其长度为2;
    第三个信元的tag为30 其长度为3;
    第四个信元的tag为31 其长度为2(02 00);
    所以返回长度后面的两个字节即可 为 32 33。

源码

//
// Created by HANWENKE on 2022/8/27.
//
/*大端模式:高位字节存放在内存的低地址,低位字节存放在高地址
 * 小端模式:低位字节存放在低地址,高位字节存放在高地址*/
#include <iostream>
#include <sstream>
#include <string.h>
#include <vector>
using  namespace std;
int main(){
    string s1;
    getline(cin,s1);
    string s2;
    getline(cin,s2);
    istringstream s(s2);
    vector<string >res;
    string temp;
    while(s>>temp){
        res.push_back(temp);
    }
    int n=0;
    stringstream ss;
    for(int i=0;i<res.size();){
       string t=res[i+2]+res[i+1];
       ss<<hex<<t;
       ss>>n;
       ss.clear();
       if(s1==res[i]){
           string rs;
           for(int j=i+3;j<i+3+n;j++){
                rs+=res[j];
                rs+=" ";
           }
           cout<<rs<<endl;
           break;
       }else{
           i+=n+3;
       }
    }
/*    cout<<s1<<endl;
    for(auto x:res){
        cout<<x <<" ";
    }*/
    return 0;
}

猴子爬台阶 题目0004

题目描述:

一天一只顽猴想要从山脚爬到山顶
途中经过一个有n个台阶的阶梯,但是这个猴子有个习惯,每一次只跳1步或3步
试问?猴子通过这个阶梯有多少种不同的跳跃方式

输入描述

输入只有一个这个数n 0 < n < 50
此阶梯有多个台阶

输出描述

有多少种跳跃方式

示例一

  • 输入

    50
    
  • 输出

    122106097
    

示例二

  • 输入

    3
    
  • 输出

    2
    

源码

//
// Created by HANWENKE on 2022/8/27.
//
#include <iostream>
using  namespace std;
void solution(const int &n){
    //第一个台阶一种方式,第2个台阶也只有一种方式,第3个台阶有两种方式
    int dp[n];
    dp[0]=0;
    dp[1]=1;
    dp[2]=1;
    dp[3]=2;
    if(n<=3){
        cout<< dp[n];
        return;
    }
    for(int i=4;i<=n;i++){
        dp[i]=dp[i-1]+dp[i-3];
    }
    cout<<dp[n];
}
int main(){
    int n;
    cin>>n;
    solution(n);
    return  0;
}

GPU算力题目0005

为了充分发挥Gpu算力,
需要尽可能多的将任务交给GPU执行,
现在有一个任务数组,
数组元素表示在这1s内新增的任务个数,
且每秒都有新增任务,
假设GPU最多一次执行n个任务,
一次执行耗时1s,
在保证Gpu不空闲的情况下,最少需要多长时间执行完成。

输入描述

第一个参数为gpu最多执行的任务个数
取值范围1~10000
第二个参数为任务数组的长度
取值范围1~10000
第三个参数为任务数组
数字范围1~10000

输出描述

执行完所有任务需要多少秒

示例一

  • 输入

    3
    5
    1 2 3 4 5
    
  • 输出

    6
    
  • 说明
    一次最多执行3个任务,最少耗时6s

示例二

  • 输入

    4
    5
    5 4 1 1 1
    
  • 输出

    5
    
  • 说明
    一次最多执行4个任务,最少耗时5s

源码

//
// Created by HANWENKE on 2022/8/27.
//
#include <iostream>
#include <vector>
using  namespace  std;
void solution(int &n,vector<int>&temp){
    int time=0;
    int remaining=0;//如果当前任务处理不完、剩下的时间
    for(auto count:temp){
        if(remaining+count>n){
            remaining=remaining+count-n;
        }else{
            remaining=0;
        }
        time++;
    }
    time+=remaining/n;
    if(remaining%n>0){
        time++;
    }
    cout<<time<<endl;
}

int main(){
    int n;//cup最多执行的个数
    cin>>n;
    //数组的长度--这一秒新增的任务个数
    int length;
    cin>>length;
    vector<int>temp;
    temp.reserve(n);
    int x;
    for(int i=0;i<length;i++){
        cin>>x;
        temp.push_back(x);
    }
    solution(n,temp);
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HANWEN KE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值