上方山骇客协会算法小组训练题(三) 10.31-11.06

上方山骇客协会算法小组训练题(三)

 

1.填空题,在题目的最后给出结果即可

题目

 

【问题描述】

  作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员,

组成球队的首发阵容。

  每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1

号位至 5 号位的评分之和最大可能是多少?

 

编号     1号位     2号位     3号位     4号位     5号位

1     97     90     0     0     0

2     92     85     96     0     0

3     0     0     0     0     93

4     0     0     0     80     86

5     89     83     97     0     0

6     82     86     0     0     0

7     0     0     0     87     90

8     0     97     96     0     0

9     0     0     89     0     0

10     95     99     0     0     0

11     0     0     96     97     0

12     0     0     0     93     98

13     94     91     0     0     0

14     0     83     87     0     0

15     0     0     98     97     98

16     0     0     0     93     86

17     98     83     99     98     81

18     93     87     92     96     98

19     0     0     0     89     92

20     0     99     96     95     81

 

结果:490

2.编程题,给出程序源码和结果。

【问题描述】

  小明用字母 A 对应数字 1,B 对应 2,以此类推,用 Z 对应 26。对于 27以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27,AB 对应 28,AZ 对应 52,LQ 对应 329。

  请问 2019 对应的字符串是什么?

 

程序源码:

#include <iostream>

using namespace std;

int main(){

    int a;

    string output = "";

    cin>>a;

    while(a){

        output = output + char(64+a%26);

        a /= 26;

    }

    for(int i = output.length()-1;i >=0 ;i--)

        cout<<output[i];

    return 0;

}

 

结果:BYQ

这题也可以通过Excel来做,或者直接手算26进制,然后使用A-Z来表示26进制

3.编程题,给出程序源码和结果。

【问题描述】

给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求第 20190324项的最后 4 位数字。

 

程序源码:

#include <iostream>

using namespace std;

int ans[20190324]={0};

int fibonacci(int a,int b,int c,int n){

    ans[n] = (a+b+c)%10000;

}

int main(){

    ans[0] = 1;

    ans[1] = 1;

    ans[2] = 1;

    for(int i=3;i < 20190324; i++){

        fibonacci(ans[i-3],ans[i-2],ans[i-1],i);

    }

    cout<<ans[20190323];

    return 0;

}

 

答案:4659

4.编程题,给出程序源码

【问题描述】

把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包

含数字 2 和 4,一共有多少种不同的分解方法?

注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和

1001+1000+18 被视为同一种。

源码:

#include <iostream>

using namespace std;

int number = 2019;

bool is_ok(int n){

    int mid;

    while(n){

        mid = n%10;

        if(mid==2||mid==4)

            return false;

        n /= 10;

    }

    return true;

}

int main(){

    int ans = 0;

    for(int i = 1; i < 673; i++){

        for(int j = i+1; j < 1346; j++) {

            for (int k = j+1; k < 2019; k++) {

                if (i + j + k != 2019)

                    continue;

                if (is_ok(i) && is_ok(j) && is_ok(k)) {

                    ans++;

                }

            }

        }

    }

    cout<<ans;

    return 0;

}

 

 

 

 

 

答案:40785

5. 编程题,给出程序源码和结果。

 

标题:明码

 

汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛。

16点阵的字库把每个汉字看成是16x16个像素信息。并把这些信息记录在字节中。

 

一个字节可以存储8位信息,用32个字节就可以存一个汉字的字形了。

把每个字节转为2进制表示,1表示墨迹,0表示底色。每行2个字节,

一共16行,布局是:

 

    第1字节,第2字节

    第3字节,第4字节

    ....

    第31字节, 第32字节

 

这道题目是给你一段多个汉字组成的信息,每个汉字用32个字节表示,这里给出了字节作为有符号整数的值。

 

题目的要求隐藏在这些信息中。你的任务是复原这些汉字的字形,从中看出题目的要求,并根据要求填写答案。

 

这段信息是(一共10个汉字):

4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0

16 64 16 64 34 68 127 126 66 -124 67 4 66 4 66 -124 126 100 66 36 66 4 66 4 66 4 126 4 66 40 0 16

4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0

0 -128 64 -128 48 -128 17 8 1 -4 2 8 8 80 16 64 32 64 -32 64 32 -96 32 -96 33 16 34 8 36 14 40 4

4 0 3 0 1 0 0 4 -1 -2 4 0 4 16 7 -8 4 16 4 16 4 16 8 16 8 16 16 16 32 -96 64 64

16 64 20 72 62 -4 73 32 5 16 1 0 63 -8 1 0 -1 -2 0 64 0 80 63 -8 8 64 4 64 1 64 0 -128

0 16 63 -8 1 0 1 0 1 0 1 4 -1 -2 1 0 1 0 1 0 1 0 1 0 1 0 1 0 5 0 2 0

2 0 2 0 7 -16 8 32 24 64 37 -128 2 -128 12 -128 113 -4 2 8 12 16 18 32 33 -64 1 0 14 0 112 0

1 0 1 0 1 0 9 32 9 16 17 12 17 4 33 16 65 16 1 32 1 64 0 -128 1 0 2 0 12 0 112 0

0 0 0 0 7 -16 24 24 48 12 56 12 0 56 0 -32 0 -64 0 -128 0 0 0 0 1 -128 3 -64 1 -128 0 0

 

 

注意:需要提交的是一个整数,不要填写任何多余内容。

 

程序源码:

#include<iostream>

#include <fstream>

#include<algorithm>

#include <math.h>

using namespace std;

string transformate(int n){//将整数转化为二进制补码

    string re = "";

    if(n>=0){

        while(n){

            int mid = n % 2;

            re.insert(0,1,char(48+mid));

            n /= 2;

        }

        while(re.length()<8){

            re.insert(0,1,'0');

        }

    } else{

        n = - n;

        re.insert(0,1,'1');

        while(n){

            int mid = n % 2;

            re.insert(1,1,char(48+mid));

            n /= 2;

        }

        while(re.length()<8){

            re.insert(1,1,'0');

        }

        for(int i = 1; i < 8; i++){

            if(re[i] == '0'){

                re[i] = '1';

            } else{

                re[i] = '0';

            }

        }

        int c = 0,mid = 7;

        while(re[mid]=='1'& mid >= 0){

            mid--;

        }

        if(mid != 0){

            re[mid]='1';

            while(mid<7){

                re[mid] = '0';

                mid++;

            }

        } else{

            re = "10000000";

        }

    }

    return re;

}

int main(){

    ifstream input("/Users/qiguan/A.txt");//读取文件

    string ans[16];

    int mid;

    for(int i = 0; i < 10; i++){

        for(int j = 0; j < 32; j++){

            input>>mid;//从文件中读取数

            ans[i]+=transformate(mid);

        }

        cout<<endl;

    }

    for(int i = 0; i < 10; i++){

        for(int j = 0; j < 16; j++){

            for(int k = j*16; k < (j+1)*16; k ++){

                if(ans[i][k]=='1')

                    cout<<'*';//输出,如果是1则输出*,如果是0则输出' '

                else

                    cout<<' ';

//                cout<<ans[i][k];

            }

            cout<<endl;

        }

        cout<<endl;

    }

//转换为二进制补码后,显示的内容为:9的9次方等于多少?

    printf("%lf",pow(9,9));//输出答案

    return 0;

}

 

 

结果:387420489

 

6.编程题,给出程序源码和结果。

 

 

标题:乘积尾零

 

如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?

 

5650,4542,3554,473,946,4114,3871,9073,90,4329,

2758,7949,6113,5659,5245,7432,3051,4434,6704,3594,

9937,1173,6866,3397,4759,7557,3070,2287,1453,9899,

1486,5722,3135,1170,4014,5510,5120,729,2880,9019,

2049,698,4582,4346,4427,646,9742,7340,1230,7683,

5693,7015,6887,7381,4172,4341,2909,2027,7355,5649,

6701,6645,1671,5978,2704,9926,295,3125,3878,6785,

2066,4247,4800,1578,6652,4616,1113,6205,3264,2915,

3966,5291,2904,1285,2193,1428,2265,8730,9436,7074,

689,5510,8243,6114,337,4096,8199,7313,3685,211,

 

注意:需要提交的是一个整数,表示末尾零的个数。不要填写任何多余内容。

 

程序源码:

#include<iostream>

#include <fstream>

#include<algorithm>

#include <math.h>

using namespace std;

int main(){

    ifstream input("/Users/qiguan/B.txt");//读取文件

    long long mid_1;

    int ans;

    int mid_2;

    char mid_3;

    int data[100];

    mid_1 = 1;

    ans = 0;

    for(int i = 0; i < 100; i++){

        input>>mid_2>>mid_3;

        mid_1 *= mid_2;

        while (mid_1%10 == 0){//每次乘完计算有多少个0

            ans++;

            mid_1 /= 10;

        }

        if(mid_1>100000000)

            mid_1 %= 100000000;

    }

    cout<<ans;

    return 0;

}

 

 

结果:31

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

亓官劼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值