• 华为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
    输出格式A B C
    多组勾股数元组,按照A B C升序的排序方式输出。
    若给定范围内,找不到勾股数元组时,输出Na

    示例一

    • 输入

      1
      20
      
      • 1
      • 2
    • 输出

      3 4 5
      5 12 13
      8 15 17
      
      • 1
      • 2
      • 3

    示例二

    • 输入

      5
      10
      
      • 1
      • 2
    • 输出

      Na
      
      • 1

    源码

    
    
    //
    // Created by HANWENKE on 2022/8/27.
    //
    
    #include 
    #include 
    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    两个数组前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
      
      • 1
      • 2
      • 3
    • 输出

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

    源码

    //
    // Created by HANWENKE on 2022/8/27.
    //
    #include 
    #include 
    #include 
    #include 
    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    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 
      
      • 1
      • 2
    • 输出

      32 33
      
      • 1
    • 说明
      需要解析的信源的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 
    #include 
    #include 
    #include 
    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<
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    猴子爬台阶 题目0004

    题目描述:

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

    输入描述

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

    输出描述

    有多少种跳跃方式

    示例一

    • 输入

      50
      
      • 1
    • 输出

      122106097
      
      • 1

    示例二

    • 输入

      3
      
      • 1
    • 输出

      2
      
      • 1

    源码

    //
    // Created by HANWENKE on 2022/8/27.
    //
    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    GPU算力题目0005

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

    输入描述

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

    输出描述

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

    示例一

    • 输入

      3
      5
      1 2 3 4 5
      
      • 1
      • 2
      • 3
    • 输出

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

    示例二

    • 输入

      4
      5
      5 4 1 1 1
      
      • 1
      • 2
      • 3
    • 输出

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

    源码

    //
    // Created by HANWENKE on 2022/8/27.
    //
    #include 
    #include 
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
  • 相关阅读:
    激光雷达各品牌分析
    [模型]拉格朗日插值法
    浅谈原型链
    Data-Efficient Backdoor 论文笔记
    实战项目【7】MEMS惯性传感器的精度参数和单位换算
    微信小程序组件仿某音
    Polygon zkEVM节点代码解析
    新品怎么才能高效率地上一些攻心评价
    概括专线接入类型,互联网专线接入方式有哪些?
    《计算机网络安全》DNS与它的具体作用解析
  • 原文地址:https://blog.csdn.net/weixin_41694574/article/details/126561557