zoukankan      html  css  js  c++  java
  • [2018大华软件创新挑战赛] 模拟赛1~4题总结

    题目 输入 输出 限制 示例
     

     

    node_buffer定义了一个用于存储int型数据的缓冲器,请实现其声明的所有成员方法,并满足如下要求:
    1.除非调用pop_front,否则push_back成功的数据节点不可移除;
    2.不可添加给定之外的数据成员和成员方法;

     

    输入的第一行指定用例数量T;
    用例的第一行输入指定队列的最大节点数K;
    用例的第二行输入指定插入的节点数量M;
    用例的第三行输入指定插入的节点数值,使用空格隔开;
    用例的第四行输入指定移除的节点数量N;

     node_buffer中剩余的节点数据值,使用空格隔开;  K > 0

    class node_buffer

    {

    public:
    // 构造函数
    // 参数: max_size 指定缓冲的最大节点数
    node_buffer(int max_size);

    // 析构函数
    ~node_buffer();

    // 从队尾插入一个数据节点
    // 参数:i 待插入节点
    // 返回值:true 插入成功
    // false 插入失败,表示数据节点个数达到最大值
    bool push_back(int i);

    // 从队首移除一个数据节点
    // 返回值:true 移除成功
    // false 移除失败,表示数据节点个数为0
    bool pop_front();

    // 获取队首节点值,不移除数据
    int front();

    // 获取队尾节点值,不移除数据
    int back();

    // 获取数据节点数量
    // 返回值:数据节点数量
    int size();
    private:
    int* m_queue;
    int m_max_size;
    int m_front;
    int m_back;
    int m_size;
    };

    Input:
    1
    8
    9
    1 2 3 4 5 6 7 8 9
    4

    Output:
    5 6 7 8

    网络上有一台流媒体服务器S和一台客户端C,S向C发送流媒体数据。

    1、S的发送速率为M;
    2、C有一个缓冲区B,最大值大小为X,B接收来自S的流媒体,C处理B中的数据并清理,B的处理速度为N。
    3、为保证C处理的效率,当缓冲区大小超过80%时,C发送停止命令给S,S将停止向C发送数据。
    4、当缓冲区大小小于60%时,C向S发送重启发送数据命令,S向C发送数据。
    5、题中所有单位都是基本单位。

    请设计一个函数handle_data_func,用来处理缓冲区B,并计算C第一次向S发送重启发送数据命令的时间T0及每次发送重启命令的的时间间隔T1。
    注意:输出默认保留两位小数

     

    输入的第一行指定用例数量T;
    用例的第二行输入速率M、N;
    用例的第三行输入缓冲区大小X;

     客户端C第一次向服务端S发送重启发送数据命令的时间及时间间隔。  不考虑网络上的延时。  

    int handle_data_func(int M,int N,int X,int &T1)
    input:
    1
    2 1
    10
    output:
    10.00
    4.00

    有一种特殊的正整数(int类型),将数分为两侧,每侧至少有一位数,两侧的每个数字相加相等,请写出判断的方法用来检测是否这种数。

    比如:1236,可以拆分为123和6。

     

    输入的第一行指定用例数量T;
    用例的第二行输入正整数;

     输出是否为特殊的正整数    bool is_magicnum(int number)

    intput:
    2
    1232145
    4543622

    output:
    1
    1

    某股票操盘手账户里有N支股票,股价互不等,分别为v1,v2...vn;每支股票的持有股数为m1,m2...mn。现在操盘手要回笼资金需要卖出股票,假设卖出价格即为当前股价,请问能回笼多少种不同的资金量。比如:两支股票,股价分别为10、11,数量为1、2,则能回笼0、10、11、22、21、32,总共6种资金量

    输入的第一行指定用例数量T;
    用例的第一行输入股票种类n;
    用例的第二行输入股票的价格,以空格隔开;
    用例的第三行输入股票的数量,已空格隔开;

    输出不同资金量的个数  

    1<=n<=10
    1<=v<=20
    1<=m<=6

    Input:
    1
    2
    10 11
    1 2

    Output:
    6

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     


    第一题

      1 #include "iostream"
      2 #include "algorithm"
      3 #include "vector"
      4 
      5 using namespace std;
      6 
      7 class node_buffer
      8 {
      9 public:
     10         // 构造函数
     11         // 参数: max_size 指定缓冲的最大节点数
     12         node_buffer(int max_size)
     13         {
     14                 m_queue = (int*)malloc(sizeof(int)*max_size);
     15                 m_max_size = max_size;
     16                 m_front = 0;
     17                 m_size = 0;
     18                 m_back = -1;
     19         }
     20  
     21         // 析构函数
     22         ~node_buffer()
     23         {
     24                 m_front = 0;
     25                 m_size = 0;
     26                 m_back = -1;
     27                 free(m_queue);
     28         }
     29  
     30         // 从队尾插入一个数据节点
     31         // 参数:i 待插入节点
     32         // 返回值:true 插入成功
     33         //        false 插入失败,表示数据节点个数达到最大值
     34         bool push_back(int i)
     35         {
     36                 if(m_size >= m_max_size) return false;
     37                 m_queue[++m_back%m_max_size] = i;
     38                 m_back %= m_max_size;
     39                 m_size++;
     40                 return true;
     41         }
     42  
     43         // 从队首移除一个数据节点
     44         // 返回值:true 移除成功
     45         //         false 移除失败,表示数据节点个数为0
     46         bool pop_front()
     47         {
     48                 if(m_size<=0) return false;
     49                 m_front = (m_front+1) % m_max_size;
     50                 m_size--;
     51                 return true;
     52         }
     53  
     54         // 获取队首节点值,不移除数据
     55         int front()
     56         {
     57                 return m_queue[m_front];
     58         }
     59 
     60         // 获取队尾节点值,不移除数据
     61         int back()
     62         {
     63                 return m_queue[m_back];
     64         }
     65 
     66         // 获取数据节点数量
     67         // 返回值:数据节点数量
     68         int size()
     69         {
     70                 return m_size;
     71         }
     72 
     73         // 显示所有存在数据
     74         bool show()
     75         {
     76                 for(int i = m_front; i <= m_back; i++) cout << m_queue[i] << " ";
     77                 cout << endl;
     78         }
     79 
     80 private:
     81         int* m_queue;
     82         int  m_max_size;
     83         int  m_front;
     84         int  m_back;
     85         int  m_size;
     86 };
     87 
     88 int main()
     89 {
     90         int t;
     91         cin >> t;
     92 
     93         while(t--)
     94         {
     95                 int max_size;
     96                 cin >> max_size;//输入指定队列的最大节点数K
     97 
     98                 int push_num;
     99                 cin >> push_num;//输入指定插入的节点数量M
    100 
    101                 node_buffer queue(max_size);
    102                 vector<int> data(push_num,0);
    103                 for(int i=0; i<push_num; i++) cin >> data[i];//输入指定插入的节点数值,使用空格隔开
    104 
    105                 if (push_num > max_size) push_num = max_size;
    106                 for(int i=0; i<push_num; i++) queue.push_back(data[i]);
    107 
    108                 int pop_num;
    109                 cin >> pop_num;//输入指定移除的节点数量N
    110 
    111                 if(pop_num > queue.size()) pop_num = queue.size();
    112                 for(int i=0; i<pop_num; i++) queue.pop_front();
    113 
    114                 queue.show();
    115         }
    116         return 0;
    117 }
    View Code
     

    第二题

     1 #include <cstdio>
     2 
     3 double handle_data_func(double M,double N,double X,double &T1)
     4 {
     5         double v = M - N;
     6         double T0;
     7         T0 = (0.8 * X)/v + (0.2 * X)/N;
     8         T1 = (0.2 * X)/v + (0.2 * X)/N;
     9         return T0;
    10 }
    11     
    12 int main()
    13 {
    14         int t;
    15         scanf("%d",&t);
    16         double m, n, x;
    17         double T0,T1;
    18         while(t--)
    19         {
    20                 scanf("%lf %lf",&m,&n);
    21                 scanf("%lf",&x);
    22                 T0 = handle_data_func(m, n, x, T1);
    23                 printf("%.2f 
    ",T0);
    24                 printf("%.2f 
    ",T1);
    25         }
    26         return 0;
    27 }
    View Code
     

    第三题

     1 #include <stdio.h>
     2 #include <stdbool.h>
     3 
     4 bool is_magicnum(int number)
     5 {
     6         char arr[10] = {};
     7         int j = 0;
     8         int sumi = 0;
     9         int sumj = 0;
    10 
    11         while(number)
    12         {
    13                 arr[j++] = number%10;
    14                 number /= 10;
    15         }
    16         j--;
    17 
    18         for(int i=0; i<=j; )
    19         {
    20                 if(sumi >= sumj)
    21                 {
    22                         sumj += arr[j--];
    23                 }
    24                 else if(sumi < sumj)
    25                 {
    26                         sumi += arr[i++];
    27                 }
    28         }
    29         if(sumi == sumj)
    30         {
    31                 return true;
    32         }
    33         else
    34         {
    35                 return false;
    36         }
    37 }
    38 
    39 int main()
    40 {
    41         int t;
    42         scanf("%d",&t);
    43 
    44         int num[t];
    45         for(int i=0; i < t; i++)
    46         {
    47                 scanf("%d",&num[i]);
    48         }
    49         for(int i=0; i < t; i++)
    50         {
    51                 printf("%d
    ",is_magicnum(num[i]));
    52         }
    53         return 0;
    54 }
    View Code
     

    第四题

     1 #include <stdio.h>
     2 
     3 int result[100000];
     4 int count;
     5 
     6 void combination(int* arr,int i,int cnt)
     7 {
     8         if(i >= cnt)
     9         {
    10                 int sum = 0;
    11                 for(int j=0; j<cnt; j++)
    12                 {
    13                         sum += arr[j];
    14                 }
    15                 for(int j=0; j<count; j++)
    16                 {
    17                         if(sum == result[j]) return;
    18                 }
    19                 result[count++] = sum;
    20                 return;
    21         }
    22 
    23         int temp = arr[i];
    24         arr[i] = 0;
    25         combination(arr,i+1,cnt);
    26         arr[i] = temp;
    27         combination(arr,i+1,cnt);
    28 }
    29 
    30 int main()
    31 {
    32         int t = 0;
    33         scanf("%d",&t);
    34         while(t--)
    35         {
    36                 int n = 0;
    37                 scanf("%d",&n);
    38 
    39                 int val[n];
    40                 for(int i=0; i<n; i++)
    41                 {
    42                         scanf("%d",&val[i]);
    43                 }
    44 
    45                 int num[n];
    46                 int cnt = 0;
    47                 for(int i=0; i<n; i++)
    48                 {
    49                         scanf("%d",&num[i]);
    50                         cnt += num[i];
    51                 }
    52 
    53                 int arr[n*cnt];
    54                 cnt = 0;
    55                 for(int i=0; i<n; i++)
    56                 {
    57                         for(int j=0; j<num[i]; j++)
    58                         {
    59                                 arr[cnt++] = val[i];
    60                         }
    61                 }
    62                 printf("
    ");
    63                 combination(arr,0,cnt);
    64                 printf("%d 
    ",count);
    65         }
    66 }
    View Code 
     

     

    实现效果

  • 相关阅读:
    LeetCode(287)Find the Duplicate Number
    LeetCode(290) Word Pattern
    LeetCode(205)Isomorphic Strings
    LeetCode(201) Bitwise AND of Numbers Range
    LeetCode(200) Number of Islands
    LeetCode(220) Contains Duplicate III
    LeetCode(219) Contains Duplicate II
    命令行执行Qt程序
    LeetCode(228) Summary Ranges
    redis 的安装和使用记录
  • 原文地址:https://www.cnblogs.com/usingnamespace-caoliu/p/8975261.html
Copyright © 2011-2022 走看看